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 に似ています。オプションで呼び出される可能性があるが、テスト中に呼び出されることはない可能性があるコールバックをラップするために使用します。callback は位置引数を 0 とる必要があります (名前付き引数はサポートされていません)。id は、エラー メッセージでコールバックを識別するために使用できます (たとえば、テスト ケースの完了後に呼び出された場合)。

したがって、おそらくこれは、テスト フレームワークが非同期テストをより適切に処理できるようにするための配管作業です (テストをすぐに完了させたくない場合、開始した非同期作業によって例外がスローされますが、テストが失敗することはありません。完了)。

ただし、テストが失敗する理由はわかりません。何かが間違っている可能性があることを示唆しています:/

于 2014-09-14T15:11:48.897 に答える