【问题标题】:Dart StreamController: Test timed out after 30 secondsDart StreamController:30 秒后测试超时
【发布时间】:2020-09-02 19:58:28
【问题描述】:

我正在尝试创建一个反应式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));
    }
}

所以我假设我的测试是正确的。 提前致谢。

【问题讨论】:

    标签: flutter testing dart dart-stream


    【解决方案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, []);
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-14
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多