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