【问题标题】:How to unit test Stream.listen() in Dart如何在 Dart 中对 Stream.listen() 进行单元测试
【发布时间】:2019-10-30 11:17:11
【问题描述】:

考虑下面的测试代码...

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 样式匹配器在这里不起作用。

也许有一些方法可以使用stream.listen(...)返回的StreamSubscription.asFuture()

【问题讨论】:

    标签: unit-testing dart flutter-test


    【解决方案1】:

    您可以使用expectLater 函数等待来自您的Streamasync 响应,并使用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);
      });
    

    更新

    您可以在listen 方法中尝试expectAsync1,如果没有发出任何值,则会触发超时。

    stream.listen(
          expectAsync1(
            (event) {
              expect(event, value);
            },
          ),
        );
    

    【讨论】:

    • 这只会确认该值已发出......而不是stream.listen() 中的函数被调用。我正在寻找一种方法来确认侦听器已被调用。
    • 确认该函数已被调用。这正是expectAsync1 所做的:它包装一个函数,并要求调用包装函数,否则测试不会成功。当调用包装函数时,它肯定会调用它包装的函数。因此,如果测试成功,那么您可以确定 expectAsync1 的函数参数也被调用(恰好一次)。
    猜你喜欢
    • 1970-01-01
    • 2012-10-29
    • 2014-10-02
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 2012-01-08
    • 2019-11-02
    • 1970-01-01
    相关资源
    最近更新 更多