如何在 Dart 中对 Stream.listen() 进行单元测试

问题描述 投票:0回答:2

考虑以下测试代码...

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(...)

unit-testing dart flutter-test
2个回答
31
投票

您可以使用 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);
        },
      ),
    );

0
投票

如果它对其他人有帮助,以下是我如何使用 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

© www.soinside.com 2019 - 2024. All rights reserved.