Asp.net-Mvc-2

為 MVC2 AsyncControllers 建構單元測試

  • September 23, 2012

我正在考慮將我的一些 MVC 控制器重寫為非同步控制器。我對這些控制器進行了工作單元測試,但我試圖了解如何在非同步控制器環境中維護它們。

例如,目前我有這樣的動作:

public ContentResult Transaction()
{
   do stuff...
   return Content("result");
}

我的單元測試基本上看起來像:

var result = controller.Transaction();
Assert.AreEqual("result", result.Content);

好的,這很容易。

但是當您的控制器更改為如下所示時:

public void TransactionAsync()
{
   do stuff...
   AsyncManager.Parameters["result"] = "result";
}

public ContentResult TransactionCompleted(string result)
{
   return Content(result);
}

你認為你的單元測試應該如何建構?你當然可以在你的測試方法中呼叫非同步啟動器方法,但是你如何獲得返回值呢?

我在Google上沒有看到任何關於這個的…

感謝您的任何想法。

與任何非同步程式碼一樣,單元測試需要了解執行緒信號。.NET 包含一種稱為 AutoResetEvent 的類型,它可以阻塞測試執行緒,直到非同步操作完成:

public class MyAsyncController : Controller
{
 public void TransactionAsync()
 {
   AsyncManager.Parameters["result"] = "result";
 }

 public ContentResult TransactionCompleted(string result)
 {
   return Content(result);
 }
}

[TestFixture]
public class MyAsyncControllerTests
{
 #region Fields
 private AutoResetEvent trigger;
 private MyAsyncController controller;
 #endregion

 #region Tests
 [Test]
 public void TestTransactionAsync()
 {
   controller = new MyAsyncController();
   trigger = new AutoResetEvent(false);

   // When the async manager has finished processing an async operation, trigger our AutoResetEvent to proceed.
   controller.AsyncManager.Finished += (sender, ev) => trigger.Set();

   controller.TransactionAsync();
   trigger.WaitOne()

   // Continue with asserts
 }
 #endregion
}

希望有幫助:)

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