使用.NET 4.0进行异步单元测试

6

我有一组相当标准的单元测试。

[TestClass]
public class MyTestClass
{
    [TestMethod]
    public async Task MyClass_DoesStuff()
    {
        //...
        await foo;
    }
}

一切都很正常,但后来我需要降级到.NET 4.0。我进行了必要的包安装,并解决了构建的问题。然而,现在我的单元测试不再起作用,而是出现了以下错误:

UTA007:在MyTestClass类中定义的MyClass_DoesStuff方法没有正确的签名。标记有[TestMethod]属性的测试方法必须为非静态、公共、返回void类型且不应带任何参数,例如:public void Test.Class1.Test()。此外,如果您运行异步单元测试,则返回类型必须为Task。例如:public async Task Test.Class1.Test2()

也许测试运行程序无法识别.NET 4.0的System.Threading.Tasks.Task?我从NuGet安装了Microsoft AsyncMicrosoft BCL Build ComponentsMicrosoft BCL Portability Pack

是否有办法让我在.NET 4.0上实现异步单元测试?

编辑:

这被标记为“重复”的内容(TestMethod:async Task TestSth() does not work with .NET 4.0)是因为测试未显示在测试资源管理器中,而在我的情况下,我得到了我发布的错误。不是重复内容。

2个回答

3

asyncawait是在.NET 4.5中引入的,因此您无法在.NET 4.0中使用该语法。然而,据我所知,Task是在.NET 4.0中引入的,因此您可以直接使用Task来完成任务。

[TestMethod]
public Task MyClass_DoesStuff()
{
    Task<Foo> foo = GetSomethingAsync();
    var result = foo.Result;
}

2
Microsoft Async NuGet包为.NET 4.0添加了对asyncawait的语言支持。 - Jacob
@Jacob:你在你的测试项目中添加了那个Nuget包吗? - StriplingWarrior
1
是的,我已经将它添加到我的测试项目中,但似乎VS测试运行程序不支持它。 - Jacob

2

最简单的解决方案是将您的单元测试项目设置为 .NET 4.5。这样,MSTest 就会原生支持异步单元测试。


修复问题比建议一个全新的方式更好,你必须考虑到有些人可能受到变化量的限制,这并不是一项容易、简单的任务,尤其对于庞大的项目而言。 - AltF4_
2
@AltF4_: 仅更改单元测试项目的目标框架应该对于大型项目来说非常快速。只需要右键单击,选择属性,更改框架,保存即可。 - Stephen Cleary

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接