Dart StreamController: время ожидания истекло через 30 секунд

Я пытаюсь создать реактивный SharedPreferencesутилита, но я застрял с этой проблемой. Это мой класс

class SPUtil {
    final _workoutsStreamController = StreamController<
          Result<Iterable<PreferencesWorkout>, Exception>>.broadcast();

    @override
    Stream<Result<Iterable<PreferencesWorkout>, Exception>> getWorkouts() async* {
      final prefs = await SharedPreferences.getInstance();
      _workoutsStreamController.sink.add(success(_getStoredWorkouts(prefs)));
      yield* _workoutsStreamController.stream;
    }
}

И это мой тест

test("getWorkouts SHOULD return empty list WHEN nothing is stored",
        () async {
      SharedPreferences.setMockInitialValues({});

      final actual = await _sut.getWorkouts().first;

      expect((actual as Success).value, []);
    });

Всякий раз, когда я запускаю этот тест, он зацикливается на 30 секунд и возвращает эту ошибку

dart:async  _startMicrotaskLoop

TimeoutException after 0:00:30.000000: Test timed out after 30 seconds. See https://pub.dev/packages/test#timeouts

Все работает нормально, если я использую эту реализацию вместо

class SPUtil {
    @override
    Stream<Result<Iterable<PreferencesWorkout>, Exception>> getWorkouts() async* {
      final prefs = await SharedPreferences.getInstance();
      yield success(_getStoredWorkouts(prefs));
    }
}

Итак, я полагаю, что мой тест верен. Заранее спасибо.

1 ответ

Я наконец нашел проблему, StreamController не излучает ничего, если не прослушивается, поэтому тест проходит по таймауту.

test("getWorkouts SHOULD return empty list WHEN nothing is stored",
        () async {
      SharedPreferences.setMockInitialValues({});

      final actual = _sut.getWorkouts().first;      
      actual.listen((event) {});

      final actualResult = await actual;
      expect((actualResult as Success).value, []);
    });
Другие вопросы по тегам