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, []);
});