Проверьте, что тайм-аут должен отменить EventChannel и выдать TimeoutException

Я являюсь сопровождающим плагина Geolocator с открытым исходным кодом для Flutter и работаю над рефакторингом плагина. По популярному запросу я пытаюсь добавить параметр тайм-аута к методу плагина, который извлекает текущее местоположение.

Метод getCurrentLocation в основном прослушивает поток обновлений местоположения, захватывает первый элемент и затем отменяет поток. Теперь я хотел бы предложить возможность указать timeLimit, который при достижении должен отменить поток и выдать TimeoutException. Прежде чем я начну внедрять это в свою кодовую базу, я решил начать с небольшого доказательства концепции, чтобы проверить, все ли я понимаю. оказывается нет ;)

У меня есть следующий код:

import 'dart:async';
import 'package:flutter/services.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  TestWidgetsFlutterBinding.ensureInitialized();

  final eventChannel = EventChannel('demo');
  final log = <MethodCall>[];

  setUp(() async {
    log.clear();

    MethodChannel(eventChannel.name)
        .setMockMethodCallHandler((methodCall) async {
      log.add(methodCall);

      switch (methodCall.method) {
        case 'listen':
          await Future.delayed(Duration(milliseconds: 10));

          await ServicesBinding.instance.defaultBinaryMessenger
              .handlePlatformMessage(eventChannel.name,
                  eventChannel.codec.encodeSuccessEnvelope('one'), (_) {});

          await ServicesBinding.instance.defaultBinaryMessenger
              .handlePlatformMessage(eventChannel.name,
                  eventChannel.codec.encodeSuccessEnvelope('two'), (_) {});


          await ServicesBinding.instance.defaultBinaryMessenger
              .handlePlatformMessage(eventChannel.name,
                  eventChannel.codec.encodeSuccessEnvelope('three'), (_) {});
          break;
        case 'cancel':
        default:
          return null;
      }
    });
  });

  test('EventChannel returns the first value and cancels the stream', () async {
    final one = await eventChannel.receiveBroadcastStream().first;

    expect(one, 'one');
    expect(log, <Matcher>[
      isMethodCall('listen', arguments: null),
      isMethodCall('cancel', arguments: null),
    ]);
  });

  test('Timeout should cancel the stream', () async {
    final future = eventChannel
        .receiveBroadcastStream()
        .timeout(Duration(milliseconds: 5), onTimeout: (s) {
      s.close();
      throw TimeoutException('Timeout expired');
    }).first;

    expect(
      future,
      throwsA(predicate((e) {
        final isTimeout = e is Timeout;
        final streamCancelled = log.contains('cancel');
        return isTimeout && streamCancelled;
      })),
    );
  });
}

Первый тест (называемый "") работает, как и ожидалось, он извлекает первое значение "один" и затем отменяет поток.

Во втором тесте (называемом "") я пытаюсь проверить, что поток отменяется и по истечении времени ожидания выдается TimeoutException. Вот где я борюсь, кажется, я не понимаю, как это сделать. Возможно, я не правильно понимаю внутреннюю работу. Переменная future во втором тесте, кажется, возвращает последнее значение из потока, а не время ожидания вообще. См. следующий вывод:

00:00 +1: Timeout should cancel the stream [E]
  Expected: throws satisfies function
    Actual: <Instance of '_Future<dynamic>'>
     Which: emitted 'two'

  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 6327:7         DartError
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 4773:11        throw_
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 353347:17   fail
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 353325:18   _expect.<fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 359718:140  <fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 359765:16   [_run]
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 359718:108  <fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35912:56       _rootRunUnary
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35234:14       runUnary
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 30956:29       handleValue
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 31466:49       handleValueCallback
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 31498:17       _propagateToListeners
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 31348:25       [_complete]
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35874:24       _cancelAndValue
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 18161:17       get first.<fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 359718:140  <fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 359765:16   [_run]
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 359718:108  <fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35912:56       _rootRunUnary
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35234:14       runUnary
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35153:14       runUnaryGuarded
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 29621:22       [_sendData]
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 29569:26       [_add]
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 30263:29       [_sendData]
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 30067:24       add
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 18357:22       onData
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 359718:140  <fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 359765:16   [_run]
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 359718:108  <fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35912:56       _rootRunUnary
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35234:14       runUnary
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35153:14       runUnaryGuarded
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 29621:22       [_sendData]
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 32758:28       perform
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 32861:15       handleNext
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 32621:16       schedule.<fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 359765:16   [_run]
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 359713:86   <fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35903:56       _rootRun
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35227:14       run
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35144:14       runGuarded
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35183:33       bindCallbackGuarded.<fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 359765:16   [_run]
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 359713:86   <fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35906:14       _rootRun
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35227:14       run
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35144:14       runGuarded
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35183:33       bindCallbackGuarded.<fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35756:13       _microtaskLoop
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35762:13       _startMicrotaskLoop
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 31704:9        _scheduleImmediateWithPromise.<fn>
  ===== asynchronous gap ===========================
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35255:14       registerUnaryCallback
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 31164:27       then
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 353323:23   _expect
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 353277:12   expect$0
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 343286:12   expect$
  frame_dark.html#/%20line%2038%20%3E%20scriptElement 119:21                                     main$0.<fn>.<fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35674:34       runBody
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35702:7        _async
  frame_dark.html#/%20line%2038%20%3E%20scriptElement 114:78                                     main$0.<fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 347466:17   test.<fn>.<fn>.<fn>.<fn>.<fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35655:33       onValue
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 359718:140  <fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 359765:16   [_run]
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 359718:108  <fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35912:56       _rootRunUnary
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35234:14       runUnary
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 30956:29       handleValue
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 31466:49       handleValueCallback
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 31498:17       _propagateToListeners
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 31348:25       [_complete]
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 30714:32       doWhile.<fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 359718:140  <fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 359765:16   [_run]
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 359718:108  <fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35912:56       _rootRunUnary
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35234:14       runUnary
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35153:14       runUnaryGuarded
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35187:34       bindUnaryCallbackGuarded.<fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 359718:140  <fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 359765:16   [_run]
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 359718:108  <fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35912:56       _rootRunUnary
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35234:14       runUnary
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 30956:29       handleValue
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 31466:49       handleValueCallback
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 31498:17       _propagateToListeners
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 31357:23       [_completeWithValue]
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 31377:35       <fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 359765:16   [_run]
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 359713:86   <fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35906:14       _rootRun
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35227:14       run
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35144:14       runGuarded
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35183:33       bindCallbackGuarded.<fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35756:13       _microtaskLoop
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35762:13       _startMicrotaskLoop
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 31704:9        _scheduleImmediateWithPromise.<fn>
  ===== asynchronous gap ===========================
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35255:14       registerUnaryCallback
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35666:22       _async
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 347464:134  test.<fn>.<fn>.<fn>.<fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 348487:15   waitForOutstandingCallbacks.<fn>.<fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35674:34       runBody
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35702:7        _async
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 348484:60   waitForOutstandingCallbacks.<fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35906:14       _rootRun
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35227:14       run
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 36041:92       _runZoned
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 36006:18       runZoned
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 348484:13   waitForOutstandingCallbacks
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 347464:86   test.<fn>.<fn>.<fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35906:14       _rootRun
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35227:14       run
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 36041:92       _runZoned
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 36006:18       runZoned
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 347464:21   test.<fn>.<fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35674:34       runBody
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35702:7        _async
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 347454:109  test.<fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 348572:40   <fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35674:34       runBody
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35702:7        _async
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 348571:70   <fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 30523:31       new.<fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 359765:16   [_run]
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 359713:86   <fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35903:56       _rootRun
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35227:14       run
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35144:14       runGuarded
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35183:33       bindCallbackGuarded.<fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 359765:16   [_run]
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 359713:86   <fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35906:14       _rootRun
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35227:14       run
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35171:33       bindCallback.<fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 22859:11       internalCallback
  ===== asynchronous gap ===========================
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35248:14       registerCallback
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35182:29       bindCallbackGuarded
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 34399:74       new
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 34409:19       run
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 30521:21       new
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 348571:46   <fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35674:34       runBody
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35702:7        _async
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 348568:64   <fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35906:14       _rootRun
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35227:14       run
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 36041:92       _runZoned
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 36006:18       runZoned
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 348568:17   <fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 348593:9    [_guardIfGuarded]
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 348567:30   <fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 354673:18   capture.<fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35906:14       _rootRun
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35227:14       run
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 36041:92       _runZoned
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 36006:18       runZoned
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 354671:20   capture
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 348566:20   [_onRun]
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 4978:16        _checkAndCall
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 5021:17        callMethod
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 5024:17        dsend
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 356872:12   [_run]
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/flutter_web.js 356792:41   run
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 30536:31       microtask.<fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35903:56       _rootRun
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35227:14       run
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35144:14       runGuarded
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35183:33       bindCallbackGuarded.<fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35906:14       _rootRun
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35227:14       run
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35144:14       runGuarded
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35183:33       bindCallbackGuarded.<fn>
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35756:13       _microtaskLoop
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 35762:13       _startMicrotaskLoop
  https://storage.googleapis.com/compilation_artifacts/2.9.0-8.2.beta/dart_sdk.js 31704:9        _scheduleImmediateWithPromise.<fn>

Что я делаю не так? Можно ли написать такой тест? Любая помощь приветствуется.

ОБНОВЛЕНИЕ: я удалил ссылку на DartPad, так как он не будет запускать код в тестовой среде (например, flutter test), что может привести к ложноотрицательным результатам.


person Maurits van Beusekom    schedule 24.05.2020    source источник


Ответы (1)


С некоторой солидной помощью сообщества Flutter (и, в частности, Саймона Лайтфута) я смог решить проблему.

У меня было две ошибки в моем коде.

  1. Так как я имею дело с потоком, я не должен бросать TimeoutException, а скорее добавлять ошибку в приемник;
  2. Чтобы имитировать длительную задачу, я блокировал канал событий с задержкой в ​​10 миллисекунд. Это означает, что после истечения времени ожидания мне все равно придется ждать оставшиеся 5 миллисекунд, прежде чем вызов метода cancel будет обработан.

Итак, после некоторого рефакторинга я получил следующее рабочее решение:

  test('Timeout should cancel the stream', () async {
    final future = eventChannel
      .receiveBroadcastStream()
      .timeout(Duration(milliseconds: 5), onTimeout: (s) {
        s.addError(TimeoutException('Timeout expired'));
        s.close();
      }).first;

    expect(
      future,
      throwsA(isA<TimeoutException>()),
    );

    await Future.delayed(Duration(milliseconds: 5));

    expect(log, <Matcher>[
      isMethodCall('listen', arguments: null),
      isMethodCall('cancel', arguments: null),
    ]);
  });
person Maurits van Beusekom    schedule 24.05.2020