Async CTP v3,MS Test和Thread.Sleep

时间:2011-11-08 22:59:03

标签: mstest async-ctp thread-sleep

我有一个长时间运行的任务方法,使用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

那为什么呢?

1 个答案:

答案 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");
}