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

ra9*_*a9r 6 unit-testing dart flutter-test

考虑以下测试代码...

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!');
  });
}
Run Code Online (Sandbox Code Playgroud)

...测试stream.listen(...)回调是否被调用的正确方法是什么?

stream.listen(...)不返回一个Future所以传统expectAsyncX风格的匹配器在这里不起作用。

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

die*_*per 17

您可以使用expectLater函数来等待您的async响应,StreamStream使用emits将您的值与您发出的值进行比较,如下所示:

  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);
  });
Run Code Online (Sandbox Code Playgroud)

更新

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

stream.listen(
      expectAsync1(
        (event) {
          expect(event, value);
        },
      ),
    );
Run Code Online (Sandbox Code Playgroud)

  • 它*将*确认该函数已被调用。这正是 `expectAsync1` 所做的:它包装了一个函数,并要求调用包装函数,否则测试将不会成功。当调用包装函数时,它肯定会调用它包装的函数。因此,如果测试成功,那么您可以确定`expectAsync1` 的函数参数也被调用了(恰好一次)。 (3认同)