【问题标题】:Running Async Task unit tests with TFS 2010使用 TFS 2010 运行异步任务单元测试
【发布时间】:2012-12-26 08:09:10
【问题描述】:

我正在编写一个使用 Async 库以 .NET 4.0 为目标的 VS 2012 编写的应用程序。

我的自动构建在安装了 VS 2012 和 .NET 4.5 的 TFS 2010 构建代理上运行。

我到处都读到,如果您的单元测试是异步的,它必须具有 async Task TestMethod() 签名(而不是 async void TestMethod())。

但是,当我这样做时,我的构建服务器给我该方法的错误:

用[TestMethod]属性标记的测试方法必须是非静态的、公开的、不返回值且不应带任何参数。例如:public void Test.Class1.Test()。

我已阅读thisthis 表明如果您有一个 .testsetting 文件,则可能会导致此错误。但两者都表示它们适用于 TFS/VS 2012 的 beta 版本。

另外,我需要我的测试设置文件来打开代码覆盖率。

这是 TFS 2012 唯一的事情吗? TFS 2010 Build 代理不能使用 VS 2012 来正确运行这些吗?

有没有办法在不升级到 TFS 2012 的情况下完成这项工作?(距离升级还有几个月的时间)。

【问题讨论】:

  • 我认为 2010 版的 MsTest 根本不理解这些类型的测试。我希望 TFS 2010 将使用 2010 版的 MsTest(这样做有点硬)。您可以更改工作流程以显式使用新的 VS2012 测试框架,但这可能需要进行大量修改才能实际工作。

标签: .net unit-testing tfs async-await


【解决方案1】:

您可以使用类似于我描述的on my blog 的方法:只需将每个单元测试的代码包装在AsyncContext.Run 中(您可以从我的AsyncEx NuGet library 获得AsyncContext)。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,我用一个在构建服务器上工作的丑陋解决方法解决了它(直到你升级到 tfs 2012)

    [TestMethod]
    public void TestMethod()
    {
      //TODO: fix this after upgrade to TFS2012 build server
      var task = TestMethodInnerMethod();
      task.Wait();
    }
    
    private async Task TestMethodInnerMethod()
    {
      //Arrange
    
      //Act
      await Provider.StartAsync();
    
      //Assert
    }
    

    更新:更好的解决方案,使用 http://nuget.org/packages/Nito.AsyncEx/ 并使用 AsyncContext.Run(...) 进行包装

    [TestMethod]
    public void TestMethod()
    {
      //TODO: fix this after upgrade to TFS2012 build server
      AsyncContext.Run(async () =>
      {
        //Arrange
    
        //Act
        await Provider.StartAsync();
    
        //Assert
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-08-02
      • 2016-02-11
      • 1970-01-01
      • 2011-01-29
      • 2011-07-08
      • 2020-05-21
      • 1970-01-01
      • 2016-09-21
      相关资源
      最近更新 更多