如何检查async / await是否真的异步?

时间:2013-06-12 10:26:42

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

我已经使用 async/await 在c#5.0中基于WebApi个新关键字构建了某个应用程序(服务),这很酷,我已经创建了一个来自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;
}

2 个答案:

答案 0 :(得分:2)

不要单元测试语言功能 - 它们已经由比你有更多钱的人测试过。而是测试您的业务逻辑。

在这里阅读关于async / await行为的msdn: http://msdn.microsoft.com/en-us/library/vstudio/hh156513.aspx

  

该方法以同步运行,直至到达第一个await   表达式,此时该方法暂停,直到等待   任务完成。在此期间,控制权返回给调用者   该方法,如本主题后面的示例所示。

答案 1 :(得分:1)

我同意Cheburek的一般意见:不要浪费时间单元测试awaitTask.Run等内容。

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

[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;
}