颤振/飞镖单元测试,如何提前定时器

时间:2020-05-04 11:54:04

标签: unit-testing flutter asynchronous time

我的flutter应用程序中有一个Stream<T>,它在引擎盖下使用timeout()。一切正常,但是运行单元测试需要一段时间,因为它们必须等待每次超时。

从资料来源timeout()可以看到,实现基于Timer()。有没有办法人为地延长Timer()在单元测试环境中的时间?

例如,在RxJava中,TestScheduler的方法类似于advanceTimeBy/advanceTimeTo。我正在寻找类似的功能。

更新

代码看起来像这样:

extension StreamEx<T> on Stream<T> {

  /// timeout only the first emission
  Stream<T> timeoutFirst(Duration timeLimit) =>
      MergeStream([
        take(1).timeout(timeLimit), 
        skip(1),
      ]);
}

我在这里对测试的要求是它的运行时不应依赖于timeLimit传递给该方法的任何东西。 RxJava可以实现,但是如何在Darts流中修复它。

更新

测试看起来像这样:

void main() async {
  group(
    'StreamEx.timeoutFirst',
    () {
      const TIMEOUT = Duration(milliseconds: 100);
      const DELAY = Duration(milliseconds: 110);
      test(
        'should throw `TimeoutException` if it took too long for the first emission',
        () async {
          final subject = BehaviorSubject<int>();
          final stream = subject.timeoutFirst(TIMEOUT).dump('tag0');

          expectLater(
            stream,
            emitsInOrder([
              emitsError(isInstanceOf<TimeoutException>()),
              emits(equals(1)),
              emits(equals(2)),
            ]),
          );

          await Future.delayed(DELAY);
          subject.add(1);
          subject.add(2);
          subject.close();
        },
      );
    },
  );
}

0 个答案:

没有答案