提问者:小点点

为什么不能识别异步void单元测试?


单元测试无法在Visual Studio 2012中运行:

[TestClass]
public class MyTestClass
{
    [TestMethod]
    public async void InvisibleMyTestMethod()
    {
        await Task.Delay(1000);
        Assert.IsTrue(true);
    }
}

如果我想进行异步单元测试,测试方法必须返回一个任务:

[TestMethod]
public async Task VisibleMyTestMethod()
{
    await Task.Delay(1000);
    Assert.IsTrue(true);
}

为什么会这样呢?并不是说我绝对需要有一个测试方法,我只是好奇。当您构建测试方法时,Visual Studio2012不会给出警告或错误,即使它无法运行。


共3个答案

匿名用户

方法应该被认为是“激发并忘记”--没有办法等待它们完成。如果Visual Studio要启动这些测试之一,它将无法等待测试完成(将其标记为成功)或捕获引发的任何异常。

使用,调用方能够等待执行完成,并捕获运行时引发的任何异常。

有关的更多讨论,请参阅此答案。

匿名用户

这只是因为MSTest不支持单元测试。通过引入它们可以在其中执行的上下文,可以做到这一点。

MSTest不支持这一点,可能是因为Microsoft认为这对现有测试的改动太大了(如果给出了一个意外的上下文,现有测试可能会死锁)。

没有编译器警告/错误,因为它是完全有效的C#代码。它不能工作的唯一原因是单元测试框架(例如,我相信xUnit确实支持tests),如果C#编译器查看您的属性,确定您正在使用MSTest,并决定您真的不想使用,这将严重违反关注点分离原则。

匿名用户

我在VS2015中发现,任何用async修饰的测试方法都不会显示在Test Explorer中。最后,我删除了async关键字,用task.wait()替换了测试中的await调用,并对task.result进行了测试。

看起来还不错。还没有用异常测试尝试过它。

var task = TheMethodIWantToTestAsync(someValue);
task.Wait();
var response = task.Result;

Assert.IsNotNull(response);
Assert.IsTrue(response.somevalue);

相关问题