如何在单元测试(Flutter)中的时间间隔内测试流是否发出任何东西?

时间:2019-05-30 06:30:52

标签: unit-testing flutter

在我的代码中,该函数在一分钟后向流发送值。假设它是一个计时器。我要进行单元测试(而不是小部件测试,因为该函数位于bloc文件中)。我尝试按照文档https://api.flutter.dev/flutter/quiver.testing.async/FakeAsync-class.html中的描述使用fakeAsync,但是没有运气。超时测试失败。 经过测试的代码:

class BarcodeBloc {
  Timer _timer;
  StreamController<bool> _timerFinished;

  BarcodeBloc() {
    _timerFinished = new StreamController();
  }

  Stream<bool> get cameraTimeout => _timerFinished.stream;

  void _tick() {
    _timerFinished.add(true);
  }

  void startTimer() {
    stopTimer();
    print("starting timer");
    _timer = Timer(interval, _tick);
  }

  void stopTimer() {
    if (_timer != null) {
      _timer.cancel();
    }
  }
}

我的测试代码:

void main() {

  test("After one minute emits true", () {
    new FakeAsync().run((async) {
       BarcodeBloc barcodeBloc = new BarcodeBloc(preferenceProvider);
       barcodeBloc.startTimer();

       async.elapse(duration);
       expect(barcodeBloc.cameraTimeout, emits(true));
  });
}

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。 emits似乎无法与FakeAsync配合使用,并且在使用FakeAsync区域中的任何await调用时遇到问题,所以最终我做了这样的事情:

void main() {
  var streamOutput;

  test("After one minute emits true", () {
    FakeAsync().run((async) {
       BarcodeBloc barcodeBloc = BarcodeBloc(preferenceProvider);
       barcodeBloc.startTimer();
       barcodeBloc.cameraTimeout.listen((value) {
         streamOutput = value;
       });

       async.elapse(duration);
       expect(streamOutput, /* expected value */);
  });
}