Как выполнить модульный тест Stream.listen () в Dart - PullRequest
0 голосов
/ 16 июня 2019

Рассмотрим следующий тестовый код ...

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

1 Ответ

1 голос
/ 16 июня 2019

Вы можете использовать функцию waitLater , чтобы дождаться ответа async от вашего Stream и сравнить 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);
        },
      ),
    );
...