考虑以下测试代码...
main() {
StreamController controller;
setUp(() {
controller = StreamController.broadcast(sync: false);
});
tearDown(() {
controller.close();
});
test('Stream listen test', () {
var stream = controller.stream;
stream.listen((event) {
// >>>>> How can I test if this was called?? <<<<<<
});
controller.add('Here is an event!');
});
}
...测试
stream.listen(...)
回调被调用的正确方法是什么?
stream.listen(...)
不会返回 Future
,因此传统的 expectAsyncX
风格匹配器在这里不起作用。
也许有某种方法可以使用
StreamSubscription.asFuture()
返回的 stream.listen(...)
?
您可以使用 expectLater 函数等待
async
的 Stream
响应,并使用 emits将您的
Stream
与发出的值进行比较,如下所示:
test('Stream listen test', () {
var stream = controller.stream;
final String value = 'Here is an event!';
stream.listen((event) {
// >>>>> How can I test if this was called?? <<<<<<
});
expectLater(stream, emits(value));
controller.add(value);
});
更新
您可以围绕您的
expectAsync1
方法尝试 listen
。如果没有发出任何值,则会触发超时。
stream.listen(
expectAsync1(
(event) {
expect(event, value);
},
),
);
如果它对其他人有帮助,以下是我如何使用 mocktail 进行测试:
test('Stream listen test', () {
var stream = controller.stream;
stream.listen((event) {
myMockClass.myMethod(event);
});
controller.add('Here is an event!');
await pumpEventQueue();
verify(() => mockClass.myMethod("Here is an event!")).called(1);
});
注意await PumpEventQueue(),这是确保处理流事件所必需的。
参考:https://manichord.com/blog/posts/test-streams-in-flutter.html