【问题标题】:how to unit test heavily asynchronous processes in dart?如何在 dart 中对大量异步进程进行单元测试?
【发布时间】:2014-04-28 04:39:31
【问题描述】:

我有一个库,其中包含许多异步部分,测试它的特定部分有时可能意味着在测试可以实际运行之前等待 n 个异步进程完成。我一直在用这个方法来达到我的目的:

void expectAsyncWithReadyCheckAndTimeout(bool readyCheck(), int timeout, void expect()){
  DateTime start = new DateTime.now();
  Duration limit = new Duration(seconds: timeout);
  var inner;
  inner = (){
    if(readyCheck()){
      expect();
    }else if(new DateTime.now().subtract(limit).isAfter(start)){
      throw 'async test timed out';
    }else{
      Timer.run(expectAsync(inner));
    }
  };
  inner();
}

这基本上会一直运行,直到测试准备好运行或直到某个指定的超时到期,有没有办法直接使用 dart unittest 库实现这一点或类似的东西?

【问题讨论】:

    标签: unit-testing asynchronous dart dart-async dart-unittest


    【解决方案1】:

    我通常做的是使用expectAsync 创建一个“完成”函数,然后在复杂测试完成时调用该函数。

    testFoo() { 
      var done = expectAsync((){});
      someComplexTest(....
         ...
         if (eveerythingOk) done();
         ..
      )
    }
    

    即:预先创建 expectAsync 包装函数,并在认为测试成功完成时调用它 - 手动处理其他所有事情。

    【讨论】:

      【解决方案2】:

      您可以向expectAsync 添加一个可选参数,说明该方法需要被调用的频率。

      【讨论】:

      • 这个论点不只是告诉它需要调用 N 次吗?我不明白为什么有人要这样做,我只希望我的异步测试在我所有其他异步进程都完成并且测试准备好时运行一次,但我不知道在测试之前有多少异步进程要完成准备好了,它通常可能在 1 到 20 之间。
      • 就是这样。好像没看懂你的问题。
      • 好吧,可以说,我打电话给expectAsync((){/*expectStuff*/}, count: 4) 这不是expectStuff 4 次吗?如果我的异步进程还没有完成4次expectsStuff它会失败不是吗?或者如果它仅在最后一次执行时expectsStuff,我不知道我的测试包含 4 个异步进程,它可能是链接在一起的任意数量的异步进程,所以如果它等待 5 个或更多异步,测试将再次失败链调用不会吗?
      • 在创建异步进程时能否为每个异步进程创建一个expectAsync
      • 好吧,我基本上是在为完整的 Web 堆栈创建完整的端到端测试,测试通过调用视图上的方法开始,然后异步调用服务器,然后可能会执行任何操作在最终返回对视图的响应并更新自身之前,对服务和数据库等的异步调用次数。 expectAsyncWithReadyCheckAndTimeout 满足了我的需求,因为它会在任意数量的异步进程完成后进行评估,前提是它在超时限制内,这只是作为预防措施,因此不允许永远运行测试。我只是希望有一个内置的
      猜你喜欢
      • 2012-10-29
      • 2019-10-30
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 2014-10-02
      • 1970-01-01
      相关资源
      最近更新 更多