为什么无法识别“异步无效”单元测试
本文关键字:无效 异步无效 单元测试 异步 识别 为什么 | 更新日期: 2023-09-27 18:35:08
async void
单元测试无法在Visual Studio 2012中运行:
[TestClass]
public class MyTestClass
{
[TestMethod]
public async void InvisibleMyTestMethod()
{
await Task.Delay(1000);
Assert.IsTrue(true);
}
}
如果我想进行异步单元测试,测试方法必须返回一个 Task:
[TestMethod]
public async Task VisibleMyTestMethod()
{
await Task.Delay(1000);
Assert.IsTrue(true);
}
为什么会这样?并不是说我绝对需要有一个async void
测试方法,我只是好奇。Visual Studio 2012 在生成async void
测试方法时不会发出警告或错误,即使它无法运行...
async void
方法应被视为"即发即弃" - 没有办法等待它们完成。 如果Visual Studio要启动其中一个测试,它将无法等待测试完成(将其标记为成功)或捕获引发的任何异常。
使用async Task
,调用方能够等待执行完成,并捕获在运行时引发的任何异常。
有关async void
与async Task
的更多讨论,请参阅此答案。
我在VS2015中发现任何用异步修饰的测试方法都不会显示在测试资源管理器中。我最终删除了 async 关键字并将测试中的 await 调用替换为任务。等待()并完成了我对任务的描述。结果。
似乎工作正常。还没有尝试过异常测试。
var task = TheMethodIWantToTestAsync(someValue);
task.Wait();
var response = task.Result;
Assert.IsNotNull(response);
Assert.IsTrue(response.somevalue);
这只是因为 MSTest 不支持async void
单元测试。可以通过引入它们可以执行的上下文来做到这一点。
MSTest 不支持此功能,可能是因为Microsoft认为这对现有测试来说变化太大(如果给定意外上下文,现有测试可能会死锁)。
没有编译器警告/错误,因为它是完全有效的 C# 代码。它不起作用的唯一原因是因为单元测试框架(即,我相信 xUnit 确实支持 async void
测试),并且 C# 编译器查看您的属性,确定您正在使用 MSTest,并决定您真的不想使用 async void
将严重违反关注点分离。