Dot-Net

如何使用 NUnit(或可能使用另一個框架)測試非同步方法?

  • August 30, 2012

我有一個 ASP.NET Web API 應用程序,它帶有一個具有非同步方法、返回Task<>對象並用async關鍵字標記的 ApiController。

public class MyApiController : ApiController
{
   public async Task<MyData> GetDataById(string id)
   {
       ...
   }
}

如何為 ApiController 的非同步方法編寫 NUnit 測試?如果我需要使用另一個測試框架,我也願意。一般來說,我對 .NET 單元測試還很陌生,所以我對學習最佳實踐很感興趣。

在我看來,NUnit 2.6 中不支持測試返回任務的非同步方法。我現在能看到的最佳選擇是使用 Visual Studio 自己的 UnitTesting 框架或 xUnit.net ,因為它們都支持非同步測試

使用 Visual Studio UnitTesting 框架,我可以編寫如下非同步測試:

using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public class TestAsyncMethods
{
   [TestMethod]
   public async Task TestGetBinBuildById()
   {
        ...
        var rslt = await obj.GetAsync();
        Assert.AreEqual(rslt, expected);
   }
}

截至今天(2014 年 7 月 2 日),非同步測試受以下支持:

在前兩個框架中,測試方法必須有這個簽名:

[TestMethod]
public async Task MyTestMethod()
{
  ...
  var result = await objectUnderTest.TestedAsyncMethod(...);
  // Make assertions
}

NUnit v2.6.2+(但在 3.0 之前),除了那個簽名,還支持這個:

public async void MyTestMethod()

當然,在任何這些測試方法中,您都可以使用await來呼叫和等待非同步方法。

如果您使用的測試框架不支持非同步測試方法,那麼唯一的方法是呼叫非同步方法並使用任何常用方法等待它完成執行:,await讀取Result由方法Task<T>返回的async,使用任何常用的等待方法,Task依此類推。在等待之後,您可以像往常一樣執行所有斷言。例如,使用 MSTest:

[TestMethod]
public void MyTestMethod()
{
   ...
   Task<MyResultClass> task = objectUnderTest.MyAsyncMethod(...);
   // Make anything that waits for the method to end
   MyResultClass result = task.Result;

   // Make the assertions
   Assert.IsNotNull(result);
   ...
}

引用自:https://stackoverflow.com/questions/12191831