异步代码的单元测试

Art*_*lin 9 c# unit-testing windows-phone-8

我有一些代码,它使用HttpWebRequest类的.BeginGetResponse()方法,它是异步的.此外,我正在使用Microsoft的Unit Test App项目来测试应用程序.

问题是测试框架没有等待运行异步代码的结束,所以我无法检查其结果.

我应该如何使用Unit Test App项目测试异步代码?我没有使用async/await modificators.

Ian*_*Ian 5

更新答案
原来的答案是相当古老的答案,之前async并且await很普遍.我现在推荐使用它们,通过写下这样的东西:

[TestMethod]
public async Task RunTest()
{
    var result = await doAsyncStuff();
    // Expectations
}
Run Code Online (Sandbox Code Playgroud)

有一篇很好的文章深入介绍了异步编程:单元测试异步代码

老答案

我倾向于简单的事情,比如使用轮询循环并检查将在异步代码中设置的标志,或者您可以使用重置事件.一个使用线程的简单示例:

[TestMethod]
public void RunTest()
{
    ManualResetEvent done = new ManualResetEvent(false);
    Thread thread = new Thread(delegate() {
        // Do some stuff
        done.Set();
    });
    thread.Start();

    done.WaitOne();
}
Run Code Online (Sandbox Code Playgroud)

您需要考虑异常并使用try/finally并报告错误以正确执行此操作,但您明白了.但是,如果你一遍又一遍地做很多异步的东西,这个方法可能不适合,除非你想把它推到一个可重用的方法中.