我有一些代码,它使用HttpWebRequest
类的.BeginGetResponse()
方法,它是异步的。另外,我正在使用 Microsoft 的 Unit Test App 项目来测试应用程序。
问题是测试框架不等待运行异步代码结束,所以我无法检查它的结果。
我应该如何使用 Unit Test App 项目测试异步代码?我没有使用异步/等待修改器。
我有一些代码,它使用HttpWebRequest
类的.BeginGetResponse()
方法,它是异步的。另外,我正在使用 Microsoft 的 Unit Test App 项目来测试应用程序。
问题是测试框架不等待运行异步代码结束,所以我无法检查它的结果。
我应该如何使用 Unit Test App 项目测试异步代码?我没有使用异步/等待修改器。
更新答案
最初的答案是一个相当古老的答案,之前async
并且await
很流行。我现在建议使用它们,通过编写如下内容:
[TestMethod]
public async Task RunTest()
{
var result = await doAsyncStuff();
// Expectations
}
有一篇很好的文章深入介绍了异步编程:单元测试异步代码
旧答案
我倾向于一些简单的事情,比如使用轮询循环并检查将在异步代码中设置的标志,或者您可以使用重置事件。一个使用线程的简单示例:
[TestMethod]
public void RunTest()
{
ManualResetEvent done = new ManualResetEvent(false);
Thread thread = new Thread(delegate() {
// Do some stuff
done.Set();
});
thread.Start();
done.WaitOne();
}
您需要考虑异常并使用 try/finally 并报告错误以正确执行此操作,但您明白了。但是,如果您一遍又一遍地执行大量异步操作,则此方法可能不适合,除非您想将其推入可重用的方法中。
您还可以使用 async/await 模式(使用Microsoft.Bcl.Async nuget 包HttpWebRequest
中的包装器)。这也将巧妙地处理后台线程中发生的任何异常。
例如:
[TestMethod]
public void RunTest()
{
bool asyncDone = false;
// this is a dummy async task - replace it with any awaitable Task<T>
var task = Task.Factory.StartNew(() =>
{
// throw here to simulate bad code
// throw new Exception();
// Do some stuff
asyncDone = true;
});
// Use Task.Wait to pause the test thread while the background code runs.
// Any exceptions in the task will be rethrown from here.
task.Wait();
// check our result was as expected
Assert.AreEqual(true, asyncDone);
}
已经晚了,但我想这会更具可读性和真实性
await Task.Delay(TimeSpan.FromSeconds(5));