안녕하세요, NUnit
을 사용하여 이벤트를 테스트하는 중에 문제가 있습니다. 이것이 단위 테스트인지 기능 테스트인지 확실하지 않습니다. (나는 OnValueInjected
이벤트를 테스트하기 위해 노력하고있어) 내가 먼저 당신에게 샘플 클래스를 보여 드리죠 :단위 테스트 중 이벤트를 잡는 방법?
public class Foo
{
private IBar CurrentBar { get; set; }
public event EventHandler<MoveEventArgs> OnValueInjected;
public Foo()
{
StartFoo();
}
private async void StartFoo()
{
await Task.Factory.StartNew(() =>
{
while (State != FooState.Finished)
{
IResult result = CurrentBar.WaitForValue(); // This is blocking function, wait for a value
OnValueInjected?.Invoke(this, new ResultEventArgs(result));
// .. rest of the loop
}
});
}
public void InjectValue(int a, int b)
{
CurrentBar.Inject(a,b);
}
}
, 기본적으로 내가 할 노력하고있어하는 이벤트에 가입 InjectValue
를 호출하고 이벤트 있는지 확인하는 것입니다 라고 불렀다. 이처럼 : InjectValue
가 너무 느립니다처럼
[Test]
public void FooOnValueInjectedTest()
{
bool OnValueInjectedWasRasied = false;
IFoo foo = new Foo();
foo.OnValueInjected += (s, e) => OnValueInjectedWasRasied = true;
foo.InjectValue(0,0);
Assert.AreEqual(true, OnValueInjectedWasRasied);
}
매우 간단하지만 보인다. 테스트가 실패했습니다. 너무 느리다 고 생각합니다. 을 InjectValue
과 Assert
사이에 추가하면 작동합니다.
foo.InjectValue(0,0);
Thread.Sleep(1000);
Assert.AreEqual(true, OnValueInjectedWasRasied);
이러한 이벤트를 테스트하는 더 좋은 방법이 있습니까? 감사합니다
나는 내 수업을 고정, 그래서 지금처럼 :
public class Foo
{
private AutoResetEvent AutoReset { get; }
private IBar CurrentBar { get; set; }
public event EventHandler<MoveEventArgs> OnValueInjected;
public Foo()
{
AutoReset = new AutoResetEvent(false);
StartFoo();
}
private async void StartFoo()
{
await Task.Factory.StartNew(() =>
{
while (State != FooState.Finished)
{
IResult result = CurrentBar.WaitForValue(); // This is blocking function, wait for a value
OnValueInjected?.Invoke(this, new ResultEventArgs(result));
AutoReset.Set();
// .. rest of the loop
}
});
}
public void InjectValue(int a, int b)
{
if (CurrentBar.Inject(a,b))
{
AutoReset.WaitOne();
}
}
}
글쎄, 당신은 * 원하는 않는 ACT에서 테스트 방법 그리고
당신이 * 당신의'이벤트 핸들러가 확실히 제기되기 전에 InjectValue'이 돌아갑니다? 기본적으로 비동기의 자연스러운 결과를보고 있습니다 ... 이벤트가 아니라 비동기 실행입니다. –@JonSkeet 음 .. 기술적으로'OnValueInjected'가 제기 될 때까지'InjectValue'가 차단 될 수 있다고 말하는 겁니까? 나는 실제로 그것에 대해 생각하지 않았습니다. –
당신이 * 그 행동을 원한다면, 당신은 그것을 확신 할 수 있습니다, 그렇습니다. 당신이하든하지 않든간에 다른 문제입니다. –