protectAsyncN如何在Dart unittest包中运行?

时间:2013-11-13 16:06:15

标签: dart dart-unittest

我真的不明白protectAsyncN方法的目的。

有人可以解释一下它应该如何运作?例如,想象一下以下测试用例:

import "package:unittest/unittest.dart";
import "dart:async";

void main() {
  test("Protect async", () {
    // given
    var controller = new StreamController();

    // when
    controller.add("This is correct!");

    // then
    controller.stream.listen(protectAsync1((event) {
      expect(event, equals("This is correct!"));
    }));
  });
}

行为应该是什么?我希望这个测试用例能够通过,但是我收到以下消息:

unittest-suite-wait-for-done
ERROR: Protect async
  Callback called (1) after test case Protect async has already been marked as pass.

0 PASSED, 0 FAILED, 1 ERRORS
Unhandled exception:
Exception: Some tests failed.
#0      SimpleConfiguration.onDone (package:unittest/src/simple_configuration.dart:213:9)
#1      _completeTests (package:unittest/unittest.dart:779:17)
#2      _runTest (package:unittest/unittest.dart:734:19)
#3      _nextTestCase (package:unittest/unittest.dart:641:11)
#4      _asyncRunCallback (dart:async/schedule_microtask.dart:18)
#5      _asyncRunCallback (dart:async/schedule_microtask.dart:21)
#6      _createTimer.<anonymous closure> (dart:async-patch/timer_patch.dart:11)
#7      _Timer._createTimerHandler._handleTimeout (timer_impl.dart:151)
#8      _Timer._createTimerHandler._handleTimeout (timer_impl.dart:159)
#9      _Timer._createTimerHandler._handleTimeout (timer_impl.dart:159)
#10     _Timer._createTimerHandler.<anonymous closure> (timer_impl.dart:166)
#11     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:93)

我尝试过使用guardAsync,它按预期工作。但是,我真的不明白protectAsync。

有人能解释一下它的用途和正确用法吗?非常感谢!

1 个答案:

答案 0 :(得分:0)

these docs中,它被描述为

  

在新函数中包装回调并返回该函数。新函数将能够通过指导它们进行正确的测试来处理异常。因此,这与expectedAsync0类似。使用它来包装任何可能被调用但在测试期间可能永远不会被调用的回调。回调应该采用0位置参数(不支持命名参数)。 id可用于标识错误消息中的回调(例如,如果在测试用例完成后调用它)。

所以可能这是允许测试框架更好地处理异步测试的管道(你不希望你的测试立即完成,然后你开始的一些异步工作抛出异常,但不会因为你的测试而失败,因为它已经完成了。)

然而,我不确定为什么测试会失败;这表明可能出现问题:/