单元测试async void MVC控制器方法不要运行

本文关键字:运行 方法 控制器 async void MVC 单元测试 | 更新日期: 2023-09-27 18:15:26

我试图测试userController通过其服务获得异步用户,做测试方法无效。问题是所有东西都编译好了,但是测试没有运行。

[TestClass]
public class UserControllerTests
{
   [TestMethod]
   public async void UserController_GetAll_Returns_Not_Null()
   {
    var result = await controller.GetALL();
    Assert.IsNotNull(result);
   }
}

单元测试async void MVC控制器方法不要运行

我在"Alexander's Embedded Techwire"中找到了答案,这里的链接只是为异步任务更改async void。

" async void "方法是"即发即忘"的方法,可能永远不会回来,这在需要从方法收集结果和断言的测试环境中是没有意义的。

    [TestClass]
    public class UserControllerTests
    {
       [TestMethod]
       public async Task UserController_GetAll_Returns_Not_Null()
       {
          var result = await controller.GetALL();
          Assert.IsNotNull(result);
       }
   }

如果您仔细查看您的输出窗口,在"test detection"(或者不管它叫什么)下,您将看到MSTest给您警告UTA007。

相反,xUnit默认支持它们,而Fixie会检测它们并显式地使它们失败。

正如您所发现的,最好的解决方案是将异常的async void改为更自然的async Taskasync Task适用于所有现代单元测试框架。

在我的幻灯片中有关于异步单元测试的更多细节,我在今年的那个会议上做了一个关于这个主题的演讲。