2

我有一个长时间运行的任务方法,使用睡眠

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/await 测试直接通过

[TestMethod]
public async void SimpleAwait() {
    Trace.TraceInformation("Start");

    await LongRunning();

    Trace.TraceInformation("End");
}

> QTAgent32.exe Information: 0 : Start
> QTAgent32.exe Information: 0 : Start Sleep

那为什么呢?

4

1 回答 1

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 年 2 月 5日更新:另一个选项是新的AsyncUnitTests 库。安装 NuGet 包,更改TestClassAsyncTestClass,然后可以更自然地编写异步单元测试:

[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");
}
于 2011-11-09T01:52:42.047 回答