비동기 방법을 단위 테스트하는 방법이 있습니까?
-
19-09-2019 - |
문제
.NET 플랫폼에서 Xunit 및 Nmock을 사용하고 있습니다. 메소드가 비동기식 인 프리젠 테이션 모델을 테스트하고 있습니다. 이 메소드는 비동기 작업을 생성하고 실행하여 메소드가 즉시 반환되고 확인 해야하는 상태가 아직 준비되지 않았습니다.
SUT를 수정하지 않고 마무리시 플래그를 설정할 수 있지만 예를 들어 타임 아웃으로 깃발을 계속 확인해야합니다.
내 옵션은 무엇입니까?
해결책
객체에 이벤트와 같이 비동기 메소드가 완료되었음을 의미하는 신호가 있습니까? 이 경우 다음 접근 방식을 사용할 수 있습니다.
[Test]
public void CanTestAsync()
{
MyObject instance = new MyObject()
AutoResetEvent waitHandle = new AutoResetEvent(false);
// create and attach event handler for the "Finished" event
EventHandler eventHandler = delegate(object sender, EventArgs e)
{
waitHandle.Set(); // signal that the finished event was raised
}
instance.AsyncMethodFinished += eventHandler;
// call the async method
instance.CallAsyncMethod();
// Wait until the event handler is invoked
if (!waitHandle.WaitOne(5000, false))
{
Assert.Fail("Test timed out.");
}
instance.AsyncMethodFinished -= eventHandler;
Assert.AreEqual("expected", instance.ValueToCheck);
}
다른 팁
#1 답변은 실제로이 문제를 해결하기 위해 오래된 패턴을 추천하기 때문에 이것에 대한 업데이트를 원할 것이라고 생각했습니다.
.NET 4.5 + XUnit 1.9 이상에서는 작업을 반환하고 선택적으로 테스트에서 비동기 키워드를 사용하여 XUnit이 테스트가 비동기 적으로 완료되기를 기다리도록 할 수 있습니다.
이 기사를 참조하십시오 xunit.net 1.9
[Fact]
public async Task MyAsyncUnitTest()
{
// ... setup code here ...
var result = await CallMyAsyncApi(...);
// ... assertions here ...
}
내가 선호하는 방법은 실제 스레딩 메커니즘을 조롱하고 주입하여 시험 중에 비동기가되지 않도록하는 것입니다. 때로는 불가능한 경우 (메소드의 스레딩이 프레임 워크의 일부이거나 다른 방법으로는 제어하에 있지 않은 경우).
스레드 생성을 제어 할 수 없다면 스레드가 어떤 식 으로든 끝날 때까지 기다리고 있습니다. 그러나 시간이 오래 걸리지 만 시간이 오래 걸리지 만 스레드는 테스트를 수행하지 않아야합니다. 어쨌든 너무 오래 걸렸습니다.
실버 라이트 애플리케이션 단위 테스트에 관한 기사를 확인하십시오
http://www.codeproject.com/kb/silverlight/ag3demolob.aspx
WCF 서비스를 비동기로 호출하는 방법을 테스트하는 단위 테스트의 예가 있습니다 ...