2016-02-02 39 views
2

我在C#和Framework 6中有一个项目。我有一个WEB API来调用这些方法。 为异步WebAPI方法编写单元测试的最佳方式是什么?如何编写异步Web API的单元测试

这是我的方法:

[HttpGet] 
[Route("GetYears")] 
public async Task<IEnumerable<Year>> GetYears() 
{ 
    IEnumerable<Year> newYears;  
    newYears = await creditApplicationsRepository.GetYearsAsync(); 
    return newYears; 
} 

回答

3

您可以使用await也需要这样做。

[TestMethod] 
public async Task GetYearsTest() 
{ 
    //_sut is the System Under Test, in this case is an instance of your controller 
    var years = await _sut.GetYears(); 
    //Any Assert that you want 
} 

并以存根方法creditApplicationsRepository.GetYearsAsync();使用这种Task.FromResult(mockReturn)的回报。

+0

你需要'GetYearsTest' async –

+0

确定我的不好,因为'await'。 –

+0

感谢您的工作解决方案。 –

2

单元测试的关键目标是测试方法内代码的功能。所以异步或不应该在功能上不是特别相关。

所以,我要说做这样的事情:

[TestMethod] 
public void GetYearsTest(){ 
    //This would assume that your web api class has a mockable repository 
    var yourClass = new YourClass(new MockRepository()); 

    //this is going to run your codes synchronously so you can get an immediate result to test on. 
    var years = yourClass.GetYears().Result; 

    //Run whatever test you want to on this 
    Assert.IsNotNull(years); 

} 

如果运行的异步测试的目的是确定如果你的代码是线程安全的,你必须发挥创意,以确定如何正确地测试代码来确保它实际上是安全的。为了帮助我,我需要更多地了解这里使用的repo,或者哪些变量可能会被线程锁定或导致错误。