2014-03-03 67 views
1

我需要爲以下類的InvokeAsync方法創建單元測試。它只是在包含複雜邏輯分支和Web服務調用的同一類中調用私有方法。但是單元測試只是爲公共方法編寫的。那麼在這種情況下我應該怎麼做?我應該在這裏測試什麼?任何建議將不勝感激。單元測試異步方法任務<bool>返回類型

public class MyCustomHandler 
{ 
    private readonly ILogger _logger; 
    private readonly HttpClient _httpClient; 

    public MyCustomHandler(HttpClient client, ILogger logger) 
    { 
     _httpClient = httpClient; 
     _logger = logger; 
    } 

    public override async Task<bool> InvokeAsync() 
    { 
     return await InvokeReplyPathAsync(); 
    } 

    private async Task<bool> InvokeReplyPathAsync() 
    { 
     // Lot of code with complex logical branches and calling web services.    
    } 
} 

回答

3

如果你的測試框架支持它(MSTest的做),你可以宣佈你的測試方法async並從那裏調用該方法。我會使用模擬框架嘲笑Web服務,例如Rhino Mocks,因此您不需要依賴實際的Web服務。

public interface IWebService 
{ 
    Task<bool> GetDataAsync(); 
} 

[TestClass] 
public class AsyncTests 
{ 
    [TestMethod] 
    public async void Test() 
    { 
     var webService = MockRepository.GenerateStub<IWebService>(); 
     webService.Expect(x => x.GetDataAsync()).Return(new Task<bool>(() => false)); 

     var myHandler = new MyCustomHandler(webService); 
     bool result = await myHandler.InvokeAsync(); 
     Assert.IsFalse(result); 
    } 
} 

[TestMethod] 
public async void TestWebServiceException() 
{ 
    var webService = MockRepository.GenerateStub<IWebService>(); 
    webService.Expect(x => x.GetDataAsync()).Throw(new WebException("Service unavailable")); 

    var myHandler = new MyCustomHandler(webService); 
    bool result = await myHandler.InvokeAsync(); 
    Assert.IsFalse(result); 
} 
+1

我想你可以測試當Web服務將引發異常情況,我會及時更新的例子 –

+2

僅供參考,有什麼'NUnit'還支持異步測試,測試方法就必須是'異步Task'代替'void' –

+2

MSTest也需要'async Task'單元測試。 –

相關問題