这是我在尝试单元测试流时遇到的问题的简化版本。
测试检查是否已将正确的事件添加到流中 - 它似乎工作正常 - 例如,将值add( 'test')
更改为add( 'test2')
将无法通过测试。
但是当您注释掉行fireKeepAliveMessage(message);
以便事件不会抛出时,单元测试将永远运行。
如何在测试中添加某种超时?或者有更好的方法解决这个问题吗?
library stream_test;
import "package:unittest/unittest.dart";
import "dart:async";
void main() {
test("aa", () {
StreamController streamController = new StreamController();
streamController.add( "test");
Stream underTest = streamController.stream;
underTest.first.then(expectAsync((e){
expect( e, equals( "test"));
}));
});
}
答案 0 :(得分:1)
我会这样做:
library stream_test;
import "package:unittest/unittest.dart";
import "dart:async";
void main() {
test("aa", () {
StreamController streamController = new StreamController();
Timer t;
Stream underTest = streamController.stream;
underTest.first.then(expectAsync((e) {
expect(e, equals("test"));
if (t != null) {
t.cancel();
}
}));
t = new Timer(new Duration(seconds: 3), () {
fail('event not fired in time');
});
streamController.add("test");
});
}
答案 1 :(得分:0)
Stream类有这个方法。
Stream timeout(Duration timeLimit, {Function void onTimeout(EventSinksink)})
使用与此流相同的事件创建新流。
每当超过timeLimit从两个事件之间传递时 stream,调用onTimeout函数。
在收听返回的流之前,倒计时才会开始。 每次从此转发事件时都会重置倒计时 流,或暂停和恢复流。
使用一个参数调用onTimeout函数:an dart-async.EventSink允许将事件放入返回的 流。此EventSink仅在调用onTimeout期间有效。
如果省略onTimeout,超时只会放一个 dart-async.TimeoutException进入返回的错误通道 流。
返回的流不是广播流,即使此流是。