0

我已经基于async/awaitc# 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;
}
4

2 回答 2

2

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

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

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

于 2013-06-12T11:41:20.983 回答
1

总的来说,我同意 Cheburek 的观点:不要浪费你的时间对诸如await和之类的东西进行单元测试Task.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;
}
于 2013-06-12T12:43:19.313 回答