我正在尝试使用.NET 4.0 BCL Async和MsTest运行异步测试方法。
似乎这种设置无法处理由于测试用例资源管理器中缺少条目而产生的[TestMethod] async Task TestSth()。将签名更改为async void后,我可以运行测试用例,但结果不正确(根本不会报告任何错误)。
我看到有人尝试过使用TFS 2010运行异步任务单元测试,但我认为应该有更好的方法来解决这个问题。
有什么建议吗?
我正在尝试使用.NET 4.0 BCL Async和MsTest运行异步测试方法。
似乎这种设置无法处理由于测试用例资源管理器中缺少条目而产生的[TestMethod] async Task TestSth()。将签名更改为async void后,我可以运行测试用例,但结果不正确(根本不会报告任何错误)。
我看到有人尝试过使用TFS 2010运行异步任务单元测试,但我认为应该有更好的方法来解决这个问题。
有什么建议吗?
async
关键字。以下是适用于我的解决方法。它需要一些技巧才能找到,但最终我所有.NET 4.0库的单元测试都被检测到并显示在Test Explorer中,运行并通过测试,并且它们全部编写为普通的 async Task
方法,而没有使用任何特殊的测试运行程序、包装器或第三方依赖。
你的单元测试项目文件现在应该包含类似于以下内容。
<ItemGroup>
<Content Include="..\..\packages\Microsoft.Bcl.1.1.10\lib\net40\System.Runtime.dll">
<Link>System.Runtime.dll</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="..\..\packages\Microsoft.Bcl.1.1.10\lib\net40\System.Threading.Tasks.dll">
<Link>System.Threading.Tasks.dll</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
就是这样了!
请记住,您的单元测试项目针对 .NET 4.5(或更高版本,如果您愿意),因此单元测试可以使用 async
方法和任何其他 .NET 4.5 特性。您正在测试的 .NET 4.0 程序集不应该有任何冲突,但如果您发现冲突,那么很可能是因为您已经重新定义了一些较新框架/C#功能的类型并将它们设为公共,从而在您尝试在单元测试中使用这些类型时引起冲突。最好的解决方案是将这些类型直接设置为要测试的项目的内部类型。
编辑:
按照这些步骤后,您可能会收到一些构建警告:
为了避免这些警告,只需编辑单元测试项目并向每个指向引用了Microsoft.Bcl.Build的项目引用添加以下元数据元素即可。所有引用 My.csproj 的项目都必须安装 NuGet 包 Microsoft.Bcl.Build。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=317569
{root}\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets
<Properties>SkipValidatePackageReferences=true</Properties>
例如:
<ProjectReference Include="..\pcl\pcl.csproj">
<Project>{664a9e98-fac7-4567-a046-0dde95fddb48}</Project>
<Name>pcl</Name>
<Properties>SkipValidatePackageReferences=true</Properties>
</ProjectReference>
完整的解释可以在附带Microsoft.Bcl.Build包的注释.targets文件中找到。以下是完整的注释,供您参考。
BclBuildValidateNugetPackageReferences
此目标验证当前项目中安装的任何Nuget包是否也安装在引用当前项目的项目中。
这是必要的,因为Nuget包不仅包含简单的引用。安装包确保:
1. 添加了目标框架的正确引用
2. 应用配置文件转换
3. 运行项目安装脚本对于在packages config中列出为当前项目安装的所有包,如果包ID与@(ValidatePackages)中指定的一个匹配,则确保在引用项目中安装了相同的包。
可以通过为引用设置SkipValidatePackageReferences=true来禁用此目标:
<ProjectReference Include="..\pcl\pcl.csproj">
<Project>{664a9e98-fac7-4567-a046-0dde95fddb48}</Project>
<Name>pcl</Name>
<Properties>SkipValidatePackageReferences=true</Properties>
</ProjectReference>
这个目标可以通过添加以下内容来禁用所有对项目的引用:
<PropertyGroup>
<SkipValidatePackageReferences>true</SkipValidatePackageReferences>
</PropertyGroup>
[TestMethod]
。你认为除了Stephen提到的解决方案之外,VS2010还有更好的方法吗?使用VS2012+(因此使用TFS2012+),就有内置支持。 - noseratio - open to workasync
关键字不会改变方法的签名,它只是一个返回Task
的方法,在.NET 4.5或.NET 4.0中都可以使用。你的单元测试项目的.NET目标版本是什么? - noseratio - open to work