Asp.net-Mvc-2
為 MVC2 AsyncControllers 建構單元測試
我正在考慮將我的一些 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 }希望有幫助:)