我正在考虑重新将一些我的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 }
希望有帮助:)