У меня есть 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();
},
);
},
);
}