asp.net-mvc-2 – 为MVC2 AsyncControllers构建单元测试

前端之家收集整理的这篇文章主要介绍了asp.net-mvc-2 – 为MVC2 AsyncControllers构建单元测试前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在考虑重新将一些我的MVC控制器重写为异步控制器.我有这些控制器的工作单元测试,但我正在尝试了解如何在异步控制器环境中维护它们.

例如,目前我有这样的动作:

  1. public ContentResult Transaction()
  2. {
  3. do stuff...
  4. return Content("result");
  5. }

我的单元测试基本上看起来像:

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

好的,这很容易

但是当你的控制器变化如下所示:

  1. public void TransactionAsync()
  2. {
  3. do stuff...
  4. AsyncManager.Parameters["result"] = "result";
  5. }
  6.  
  7. public ContentResult TransactionCompleted(string result)
  8. {
  9. return Content(result);
  10. }

你怎么想你的单元测试应该建立?您当然可以在测试方法调用异步启动器方法,但如何获取返回值?

我在Google上没有看到任何内容

感谢任何想法

解决方法

与任何异步代码一样,单元测试需要注意线程信令. .NET包含一个名为AutoResetEvent的类型,可以阻止测试线程,直到异步操作完成:
  1. public class MyAsyncController : Controller
  2. {
  3. public void TransactionAsync()
  4. {
  5. AsyncManager.Parameters["result"] = "result";
  6. }
  7.  
  8. public ContentResult TransactionCompleted(string result)
  9. {
  10. return Content(result);
  11. }
  12. }
  13.  
  14. [TestFixture]
  15. public class MyAsyncControllerTests
  16. {
  17. #region Fields
  18. private AutoResetEvent trigger;
  19. private MyAsyncController controller;
  20. #endregion
  21.  
  22. #region Tests
  23. [Test]
  24. public void TestTransactionAsync()
  25. {
  26. controller = new MyAsyncController();
  27. trigger = new AutoResetEvent(false);
  28.  
  29. // When the async manager has finished processing an async operation,trigger our AutoResetEvent to proceed.
  30. controller.AsyncManager.Finished += (sender,ev) => trigger.Set();
  31.  
  32. controller.TransactionAsync();
  33. trigger.WaitOne()
  34.  
  35. // Continue with asserts
  36. }
  37. #endregion
  38. }

希望有帮助:)

猜你在找的asp.Net相关文章