TestMethod:异步任务TestSth()不适用于.NET 4.0

我正在尝试使用.NET 4.0 BCL Async和MsTest运行异步测试方法。

由于测试用例资源管理器中缺少条目,此设置似乎无法处理[TestMethod] async Task TestSth() 。 将签名更改为async void后 ,我可以运行测试用例但结果错误(根本不会报告任何错误)。

我已经看到了使用TFS 2010运行异步任务unit testing的一个问题,但我认为应该有一个更漂亮的方法来解决这个问题。

有什么建议?

您只能将async关键字与针对.NET 4.5的MSTest引用类库一起使用。

如果由于某种原因无法使用.NET 4.5,那么您只需要手动等待任务。

即使生产代码(即被测代码)不能使用.NET 4.5,为什么测试项目不能这样做呢? 如果您已经可以使用VS 2012+,那么.NET 4.5将安装在您的开发计算机上。

这是一个适合我的解决方法。 弄清楚这有点棘手,但最后我的.NET 4.0库的所有unit testing都被检测到并出现在测试资源管理器中,运行和传递,并且它们都被编写为正常的async Task方法,没有任何特殊测试跑步者,包装者或第三方依赖者。

  1. 将unit testing项目的目标框架更改为.NET 4.5。
    • 是的,即使项目引用了您正在测试的目标.NET 4.0,也必须这样做。
  2. unit testing项目中删除Microsoft.BclMicrosoft.Bcl.BuildMicrosoft.Bcl.Async NuGet包引用。 如果您尚未添加这些引用,则只需将它们添加到unit testing项目中即可
  3. System.Runtime.dllSystem.Threading.Tasks.dll作为项目根目录中的链接文件添加到unit testing项目中。
    1. 在解决方案资源管理器中右键单击您的unit testing项目
    2. 添加 > 现有项目…
    3. 浏览到您的解决方案的packages文件夹,找到Microsoft.Bclnet40包文件夹; 例如, … \ packages \ Microsoft.Bcl.1.1.10 \ lib \ net40 \
    4. 在文件类型下拉列表中选择所有文件(*。*)
    5. 按住Ctrl键,鼠标左键单击System.Runtime.dllSystem.Threading.Tasks.dll以选择它们。
    6. 单击“ 添加”按钮上的小下拉箭头。 (不要单击“ 添加”按钮。)
    7. 在“ 添加”按钮的下拉列表中,单击“ 添加为链接” 。 现在,两个程序集都可以在项目的根目录中看到。
      • 您必须将程序集链接保留在项目的根目录中。 不要将它们移动到子文件夹。
      • 如果您的项目受源代码管理,那么您可能会注意到这些链接文件被标记为已排除(如果不是,则应该是。)不应将这些文件所在的NuGet 文件夹签入源代码管理。 由于它们只是链接文件,所以在恢复NuGet包之后,任何人都应该完全没有问题。
  4. 在解决方案资源管理器中选择两个链接的程序集文件( Ctrl +左键单击),或者只是分别对每个文件执行以下步骤。
  5. 右键单击任一选定文件,然后选择“ 属性” 。 “ 属性”窗口打开。
  6. 将“ 复制到输出目录”字段设置为“如果更新则复制”

您的unit testing项目文件现在应包含类似于以下内容的内容。

   System.Runtime.dll PreserveNewest   System.Threading.Tasks.dll PreserveNewest   

就是这样!

请记住,您的unit testing项目面向.NET 4.5(或更高版本,如果您愿意),因此unit testing可以使用async方法和任何其他.NET 4.5function。 应该与您正在测试的.NET 4.0程序集没有任何冲突,但是如果确实发现了冲突,可能是因为您为新的Framework / C#function重新定义了某些类型并将它们公开,从而导致冲突时您尝试在unit testing中使用相同类型。 最好的解决方案是简单地将这些类型设置为您正在测试的项目的内部。

编辑:
执行这些步骤后,您可能会收到一些构建警告:

引用My.csproj的所有项目都必须安装nuget包Microsoft.Bcl.Build。 有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkID=317569
{根} \包\ Microsoft.Bcl.Build.1.0.21 \建立\ Microsoft.Bcl.Build.targets

要避免这些警告,只需编辑unit testing项目 ,并将以下元数据元素添加到指向引用Microsoft.Bcl.Build的项目的每个项目引用。

 SkipValidatePackageReferences=true 

例如:

  {664a9e98-fac7-4567-a046-0dde95fddb48} pcl SkipValidatePackageReferences=true  

完整的说明可以在Microsoft.Bcl.Build包中附带的.targets文件中找到。 为方便起见,这是完整的评论。

BclBuildValidateNugetPackageReferences

此目标validation当前项目中安装的任何Nuget包也安装在引用当前项目的项目中。

这是必要的,因为Nuget包不仅包含简单的引用。 安装包确保
1.添加了针对目标框架的正确引用集
2.应用配置文件转换
3.运行项目安装脚本

对于在package config中为当前项目安装的所有软件包,如果软件包ID与@(ValidatePackages)中指定的软件包匹配,请确保在引用项目中安装了相同的软件包。

通过为引用设置SkipValidatePackageReferences = true,可以为项目引用禁用此目标:

  {664a9e98-fac7-4567-a046-0dde95fddb48} pcl SkipValidatePackageReferences=true  

通过添加以下内容,可以对项目的所有引用禁用此目标:

  true