2

我真的不明白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。

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

4

1 回答 1

0

这些文档中,它被描述为

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

所以大概这是为了让测试框架更好地处理异步测试(你不希望你的测试立即完成,然后你开始的一些异步工作会引发异常,但不会让你的测试失败,因为它已经完全的)。

但是,我不确定为什么测试会失败;这表明可能有问题:/

于 2014-09-14T15:11:48.897 回答