我已经使用 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;
}
答案 0 :(得分:2)
不要单元测试语言功能 - 它们已经由比你有更多钱的人测试过。而是测试您的业务逻辑。
在这里阅读关于async / await行为的msdn: http://msdn.microsoft.com/en-us/library/vstudio/hh156513.aspx
该方法以同步运行,直至到达第一个await 表达式,此时该方法暂停,直到等待 任务完成。在此期间,控制权返回给调用者 该方法,如本主题后面的示例所示。
答案 1 :(得分:1)
我同意Cheburek的一般意见:不要浪费时间单元测试await
和Task.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;
}