Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TestMethod:async Task TestSth()不适用于.NET 4.0_C#_Unit Testing_.net 4.0_Async Await_Mstest - Fatal编程技术网

C# TestMethod:async Task TestSth()不适用于.NET 4.0

C# TestMethod:async Task TestSth()不适用于.NET 4.0,c#,unit-testing,.net-4.0,async-await,mstest,C#,Unit Testing,.net 4.0,Async Await,Mstest,我正在尝试使用.NET4.0BCL Async和MsTest运行异步测试方法 由于测试用例资源管理器中缺少条目,此设置似乎无法处理[TestMethod]asyncTaskTestSth()。将签名更改为asyncvoid后,我可以运行测试用例,但结果错误(不会报告任何错误) 我已经看到了一个尝试,但我认为应该有一个更好的方法来解决这个问题 有什么建议吗?您只能将async关键字与MSTest引用类库一起使用,目标是.NET 4.5 如果您出于任何原因不能使用.NET4.5,那么您只能忍受手动等

我正在尝试使用.NET4.0BCL Async和MsTest运行异步测试方法

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

我已经看到了一个尝试,但我认为应该有一个更好的方法来解决这个问题


有什么建议吗?

您只能将
async
关键字与MSTest引用类库一起使用,目标是.NET 4.5

如果您出于任何原因不能使用.NET4.5,那么您只能忍受手动等待任务


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

这里有一个适合我的解决方法。要弄清楚这一点有点棘手,但最后,所有针对.NET 4.0库的单元测试都被检测到,并显示在测试资源管理器中,运行和传递,它们都是作为正常的
异步任务
方法编写的,没有任何特殊的测试运行程序、包装器或第三方依赖项

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

    <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>
    
    例如:

    <ProjectReference Include="..\pcl\pcl.csproj">
      <Project>{664a9e98-fac7-4567-a046-0dde95fddb48}</Project>
      <Name>pcl</Name>
      <Properties>SkipValidatePackageReferences=true</Properties>
    </ProjectReference>
    
    
    {664a9e98-fac7-4567-a046-0dde95fddb48}
    pcl
    SkipValidatePackageReferences=true
    
    完整的解释可以在Microsoft.Bcl.Build软件包附带的noted.targets文件中找到。为了您的方便,下面是完整的评论

    BclBuildValidateNugetPackageReferences

    此目标验证当前项目中安装的所有Nuget软件包是否也安装在项目中 引用当前项目

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

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

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

    
    {664a9e98-fac7-4567-a046-0dde95fddb48}
    pcl
    SkipValidatePackageReferences=true
    
    通过添加以下内容,可以对项目的所有引用禁用此目标:

    
    真的
    
    您所说的“测试用例浏览器中缺少条目”是什么意思?您的异步测试方法必须返回任务,而不是void。VS2010只是没有内置的对异步
    [TestMethod]
    的支持。除了你提到的Stephen's,为什么你认为VS2010还有更好的方法?对于VS2012+(以及TFS2012+),有内置的支持。感谢您的评论!我已经在使用VS 2013,但以.NET 4.0为目标,异步任务方式是不可能的。这就是我所说的“缺少条目”——我根本无法启动测试用例@Noseratio:Stephen的解决方案还可以-我只是在寻找另一个“神奇”NuGet包之类的解决方案,而不是包装每个测试方法;-)@菲利浦,我不明白为什么不可能。
    async
    关键字不会更改
    <ProjectReference Include="..\pcl\pcl.csproj">
      <Project>{664a9e98-fac7-4567-a046-0dde95fddb48}</Project>
      <Name>pcl</Name>
      <Properties>SkipValidatePackageReferences=true</Properties>
    </ProjectReference>
    
    <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>