加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-15 20:02:18 所属栏目:asp.Net 来源:网络整理
导读:我正在考虑重新将一些我的MVC控制器重写为异步控制器.我有这些控制器的工作单元测试,但我正在尝试了解如何在异步控制器环境中维护它们. 例如,目前我有这样的动作: public ContentResult Transaction(){ do stuff... return Content("result");} 我的单元测
我正在考虑重新将一些我的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
}

希望有帮助:)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读