Тестирование флаттера / дротика, как опередить время для таймера - PullRequest
0 голосов
/ 04 мая 2020

У меня есть Stream<T> в моем приложении, которое использует timeout() под капотом. Все работает нормально, но выполнение модульных тестов занимает некоторое время, так как им приходится каждый раз ждать тайм-аут.

Как я вижу из источников timeout() реализация основана на Timer(). Есть ли способ искусственно увеличить время для Timer() в среде модульного тестирования?

Например, в Rx Java есть 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 методу. Это возможно с Rx Java, но как это исправить в потоках Дартс.

Обновление:

Тест может выглядеть так:

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();
        },
      );
    },
  );
}
...