문제

.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 서비스를 비동기로 호출하는 방법을 테스트하는 단위 테스트의 예가 있습니다 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top