2012-11-29 2 views
4

몇 가지 간단한 데이터 다운로드를 테스트하기위한 테스트 방법을 만들려고합니다. 나는 다운로드가 HttpRequestException으로 실패해야하는 테스트 케이스를 만들었다. 비동기 버전을 테스트 할 때 테스트는 잘 작동하고 성공하지만 asnyc 버전을 테스트 할 때는 실패합니다.Assert.ThrowsException 비동기 함수 유닛 테스트에서?

비동기/대기 메서드의 경우 Assert.ThrowsException 사용에 대한 트릭이란 무엇입니까?

[TestMethod] 
    public void FooAsync_Test() 
    { 
     Assert.ThrowsException<System.Net.Http.HttpRequestException> 
(async() => await _dataFetcher.GetDataAsync()); 
    } 

답변

6

AFAICT, Microsoft는 이것을 포함하는 것을 잊어 버렸습니다. 확실히 IMO가 있어야합니다 (동의하면 vote on UserVoice).

그동안 아래 방법을 사용할 수 있습니다. AsyncAssert 클래스에서 my AsyncEx library에 있습니다. 나는 가까운 장래에 NuGet 라이브러리로 AsyncAssert을 출시 할 계획입니다,하지만 지금 당신은 당신의 테스트 클래스에서이 넣을 수 있습니다 :

public static async Task ThrowsAsync<TException>(Func<Task> action, bool allowDerivedTypes = true) 
{ 
    try 
    { 
     await action(); 
     Assert.Fail("Delegate did not throw expected exception " + typeof(TException).Name + "."); 
    } 
    catch (Exception ex) 
    { 
     if (allowDerivedTypes && !(ex is TException)) 
      Assert.Fail("Delegate threw exception of type " + ex.GetType().Name + ", but " + typeof(TException).Name + " or a derived type was expected."); 
     if (!allowDerivedTypes && ex.GetType() != typeof(TException)) 
      Assert.Fail("Delegate threw exception of type " + ex.GetType().Name + ", but " + typeof(TException).Name + " was expected."); 
    } 
} 
+0

덕분에, 나 또한 당신과 같은 해결 방법을 구현 한, 그러나 나는 희망 바로 사용할 수있는 Microsoft 솔루션이 될 수 있습니다. 고마워, 그들이 그것을 아직하지 않은 것을 분명히하기 위해! – Tom

+1

이것은 업데이트 2에서 수정되었습니다 : http://support.microsoft.com/kb/2797912 – Quango

+0

여전히 VS 2013에서 문제가있는 것 같습니다. – Ben

관련 문제