【问题标题】:How to check if async/await really async?如何检查 async/await 是否真的异步?
【发布时间】:2013-06-08 10:16:00
【问题描述】:

我已经使用 WebApi 在 c# 5.0 中基于 async/await 新关键字构建了一个特定的应用程序(服务),它本身很酷,我已经从 Oracle db Http_Request 创建了一个调用,但我已经测试过了,感觉不太对,如果是这样,我该如何对 async 问题进行单元测试?

public async Task<WebResponse> Post(Customer customer)
{
        if (!customer.ReturnSuccess()) throw new ArgumentNullException("customer");
        _logger.Info(string.Format("Customer validation request - date = {0} \n {1}\t\n", DateTime.Now, customer));
        try
        {
            return await Task.Factory.StartNew(() => _service.EvaluateCustomer(customer));
        }
        catch (Exception e)
        {
            _logger.ErrorException("Error", e);
        }
        return null;
}

【问题讨论】:

  • “感觉不对”是什么意思?你到底想测试什么?
  • P.S.您应该在 async 代码中使用 Task.Run 而不是 Task.Factory.StartNew
  • @svick 响应是同步的而不是异步的,所以我的问题是我可以测试它的异步吗?
  • @StephenCleary 你能解释一下吗?
  • Stephen Toub has all the details here. 综上所述:Task.Run 有更合理的默认参数,并且理解async 方法。

标签: asp.net-mvc-4 async-await c#-5.0


【解决方案1】:

不要对语言特性进行单元测试——它们已经由比你有钱的人测试过。而是测试您的业务逻辑。

在此处阅读有关 async/await 行为的 msdn: http://msdn.microsoft.com/en-us/library/vstudio/hh156513.aspx

该方法同步运行直到它第一次等待 表达式,此时方法被挂起,直到等待 任务完成。同时,控制权返回给调用者 方法,如本主题后面的示例所示。

【讨论】:

  • 女贞!我不想测试 async/await 我想测试我的方法。
  • @lamStalker 我建议测试同步的东西——在这种情况下是 _service.EvaluateCustomer 方法。
  • 这对我有什么帮助?我知道我们同步的方法
【解决方案2】:

我总体上同意 Cheburek:不要浪费时间对 awaitTask.Run 之类的东西进行单元测试。

但是,如果您想确保 您的 方法正确等待 EvaluateCustomer,那么您注入一个受您控制的服务并确保 Post 仅在 EvaluateCustomer 完成后完成:

[TestMethod]
public async Task PostWaitsForEvaluateCustomer()
{
  var finishEvaluateCustomer = new ManualResetEvent(false);
  var service = new MyFakeService(finishEvaluateCustomer)
  {
    EvaluateCustomer = _ => finishEvaluateCustomer.WaitOne();
  };
  var objectUnderTest = new MyObject(service);

  Task postTask = objectUnderTest.Post(..);
  Assert.IsFalse(postTask.IsCompleted);

  finishEvaluateCustomer.Set();
  await postTask;
}

【讨论】:

  • 谢谢我开始测试。
猜你喜欢
  • 2015-12-19
  • 1970-01-01
  • 1970-01-01
  • 2017-09-17
  • 2017-10-26
  • 2019-05-10
  • 1970-01-01
  • 2018-12-10
相关资源
最近更新 更多