当前位置: 首页 > 知识库问答 >
问题:

异步代码的单元测试

范鸿
2023-03-14

我有一些代码,它使用的是HttpWebRequestclass的。BeginGetResponse()方法,它是异步的。另外,我正在使用微软的单元测试应用程序项目来测试应用程序。

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

如何使用Unit Test App项目测试异步代码?我没有使用异步/等待修改器。

共有3个答案

巫化
2023-03-14

虽然已经晚了,但我想这会更具可读性和真实性

await Task.Delay(TimeSpan.FromSeconds(5)); 
方嘉言
2023-03-14

您还可以使用async/await模式(使用Microsoft.Bcl.async nuget包中的HttpWebRequestwrapper)。这也将巧妙地处理在后台线程中发生的任何异常。

例如:

[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);
}
孟和玉
2023-03-14

asyncwait流行之前,最初的答案是相当古老的。我现在建议使用它们,写一些像这样的东西:

[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/last并报告错误来正确地执行此操作,但您明白了。然而,如果你一遍又一遍地做很多异步工作,这个方法可能不合适,除非你想把它推进一个可重用的方法。

 类似资料:
  • 在试验并发执行时,我想知道如何实际测试它。执行流程具有副作用性质,创建未来是为了包装独立的执行/处理。 我一直在寻找一些关于如何正确单元测试的好例子,下面的场景(和是我希望测试的方法): 情景#1 情景动机 立即返回,但调用两个执行单独任务的未来(例如,保存分析并将记录存储到数据库)。这些服务调用可以被模拟,但我试图测试的是,一旦我将它们包装在s中,这两个服务都会被调用 场景#2 情景动机 从可以

  • 问题内容: node.js模块列表中列出了30多个测试框架… 哪些框架最受欢迎?他们的优缺点是什么? 我正在寻找一个支持具有大量异步回调的代码的单元测试的框架(可能与大多数其他节点项目一样)。另外,我正在寻找简单而不是复杂的东西。 到目前为止,我已经研究了: Nodeunit很简单,通过让您定义希望调用多少个断言以及何时进行测试来支持异步代码。 Vowsjs看起来很有趣。使您可以很好地构建测试并具

  • 我在单元测试(用C#编写)中存根了必要的方法等,但问题是在断言测试之前异步操作没有完成。 我怎么才能绕过这个?我应该创建一个模拟TaskFactory或任何其他技巧来单元测试异步操作吗?

  • 问题内容: 我是Java和junit的新手。我有以下要测试的代码。如果您能提出有关测试它的最佳方法的想法,将不胜感激。 基本上,以下代码与从集群中选出领导者有关。领导者在共享缓存上持有锁,并且如果领导者以某种方式释放了对缓存的锁定,则领导者的服务将恢复并处置。 我如何确保领导者/线程仍保持对缓存的锁定,并且在执行第一个线程时另一个线程无法恢复其服务? 问题答案: 作为测试框架的替代方法(或使用JU

  • 使用Mocha测试异步代码并不简单!只需在测试完成后调用回调。通过添加一个回调(通常命名done)it(),Mocha将知道它应该等待调用此函数来完成测试。此回调接受Error实例(或其子类)或伪值; 其他任何事情都会导致测试失败。 describe('User', function() { describe('#save()', function() { it('should save wi

  • 异步代码是指当调用后不会立即完成的代码。 setTimeout(() => { console.log('do stuff'); }, 3000 ) 在 setTimeout 执行完3秒后 do stuff 会输出到控制台。我们可以看出当指定的时间过去后我们所提供的异步函数会触发。现在来看个更有启发性的示例: doWork( () => { console.log('call me whe