如何为异步Web API编写单元测试

时间:2016-02-02 18:21:43

标签: c# unit-testing asp.net-web-api

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

这是我的方法:

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

2 个答案:

答案 0 :(得分:5)

您也可以使用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)

答案 1 :(得分:2)

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

所以我会说这样做:

[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);

}

如果运行异步测试的目的是确定您的代码是否是线程安全的,那么您必须具有创造性,以确定如何正确测试代码以确保其实际上是安全的。为了让我能够提供帮助,我需要了解更多关于此处使用的仓库或者哪些变量可能会被线程锁定或导致错误。