对具有 Task 返回类型的异步方法进行单元测试<bool>



我需要为以下类的InvokeAsync方法创建一个单元测试。它所做的只是调用同一类中的私有方法,其中包括复杂的逻辑分支和 Web 服务调用。但是单元测试只为公共方法编写。那么在这种情况下我应该怎么做呢?我应该在这里测试什么?任何建议将不胜感激。

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.              
    }
}

如果你的测试框架支持它(MsTest支持),你可以async声明你的测试方法,并从那里调用该方法。我会使用模拟框架(如 Rhino Mocks)来模拟 Web 服务,这样你就不需要依赖实际的 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);
 }

最新更新