对于异步代码的单元测试
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对于异步代码的单元测试相关的知识,希望对你有一定的参考价值。
我有一些代码,这是使用qazxsw POI类qazxsw POI方法,它是异步的。另外,我使用的测试应用微软的单元测试应用项目。
问题是,测试框架不会等待运行的异步代码的结束,所以我无法检查其结果。
我应该如何使用单元测试应用项目测试异步代码?我没有使用异步/等待变质剂。
更新应答
原来答案是很旧的,HttpWebRequest
前.BeginGetResponse()
是普遍。现在我建议你使用它们,写这样的:
async
有覆盖此深入await
好文章
老回答
我会倾向于一些简单的像使用轮询循环和检查,将在异步代码进行设置,或者您可以使用重置事件的标志。使用线程一个简单的例子:
[TestMethod]
public async Task RunTest()
{
var result = await doAsyncStuff();
// Expectations
}
你需要考虑例外情况和使用try /终于和报告错误,正确地做到这一点,但你的想法。这个方法,如果你一遍又一遍地做大量的异步东西但是可能不适合,除非你看中推到一个可重用的方法这一点。
你也可以使用异步/等待模式(使用来自Async Programming : Unit Testing Asynchronous Code的[TestMethod]
public void RunTest()
{
ManualResetEvent done = new ManualResetEvent(false);
Thread thread = new Thread(delegate() {
// Do some stuff
done.Set();
});
thread.Start();
done.WaitOne();
}
包装)。这也将巧妙地处理发生在你的后台线程任何异常。
例如:
HttpWebRequest
它的晚,但我想这将是更具可读性和正宗
Microsoft.Bcl.Async nuget package
检查接受[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);
}
,使用Silverlight的单元测试框架进行单元测试异步代码。
以上是关于对于异步代码的单元测试的主要内容,如果未能解决你的问题,请参考以下文章