我有一个长时间运行的任务方法,使用Sleep
public Task LongRunning() {
return Task.Factory.StartNew(
() => {
Trace.TraceInformation("Start Sleep");
Thread.Sleep(10000);
Trace.TraceInformation("End Sleep");
});
}
这是我的测试调用的,它工作正常
[TestMethod]
public void SimpleContinueWith() {
Trace.TraceInformation("Start");
LongRunning()
.ContinueWith(
t => Trace.TraceInformation("End")
).Wait();
}
> QTAgent32.exe Information: 0 : Start
> QTAgent32.exe Information: 0 : Start Sleep
> QTAgent32.exe Information: 0 : End Sleep
> QTAgent32.exe Information: 0 : End
但是使用async /等待测试直接进行
[TestMethod]
public async void SimpleAwait() {
Trace.TraceInformation("Start");
await LongRunning();
Trace.TraceInformation("End");
}
> QTAgent32.exe Information: 0 : Start
> QTAgent32.exe Information: 0 : Start Sleep
那为什么呢?
答案 0 :(得分:4)
MSTest不能(当前)处理异步测试。我不确定微软是否会在最终版本中添加此内容。 更新:VS11 Beta确实增加了对异步单元测试的支持;见下文。
您可以通过自己提供异步上下文来单元测试异步方法。 Async CTP( Microsoft Visual Studio Async CTP \ Samples \(C#Testing)Unit Testing \ AsyncTestUtilities )中包含了一些内容,或者您可以使用我编写的名为AsyncContext的内容。
使用AsyncContext
,您的测试可以写成:
[TestMethod]
public void SimpleAwait() {
AsyncContext.Run(async () =>
{
Trace.TraceInformation("Start");
await LongRunning();
Trace.TraceInformation("End");
});
}
更新,2012-02-05:另一个选项是新的AsyncUnitTests library。安装NuGet包,将TestClass
更改为AsyncTestClass
,您的异步单元测试可以更自然地编写:
[TestMethod]
public async void SimpleAwait() {
Trace.TraceInformation("Start");
await LongRunning();
Trace.TraceInformation("End");
}
更新,2012-06-06:如果您更新到VS2012 Beta,则可以定义异步单元测试;他们只需要返回Task
:
[TestMethod]
public async Task SimpleAwait() {
Trace.TraceInformation("Start");
await LongRunning();
Trace.TraceInformation("End");
}