Как ожидать обработки потокового события в модульном тесте? - PullRequest
1 голос
/ 23 мая 2019

Под модульным тестом подразумевается, что после того, как какой-либо элемент был передан объекту Sink с помощью метода add, в ответ на него будет выполнена некоторая операция.

class Subject {
  final StreamController<Item> _itemStreamController = StreamController();
  Sink<Item> get itemsSink => _itemStreamController.sink;
  Stream<Item> get _itemsStream => _itemStreamController.sink;
  final SomeService _service;

  Subject(this._service) {
    _itemsStream.listen((item) => _service.processItem(item));
  }
}

И блокСам тест:

test('description', () async {
  final Item givenItem = Item("givenValue");
  final SomeService givenService = MockSomeService();
  final Subject subject = Subject(givenService);
  subject.itemsSink.add(givenItem);
  verify(givenService.add(givenItem));
});

И, как вы понимаете, поток зацикливания событий сначала обрабатывает verify инструкции, а только потом отправляет событие слушателю.

Если я просто вставлю await Future.value(null); между взаимодействием приемника и проверкой вызова метода, тогда все работает как чудо.Тем не менее, это решение довольно уродливо.

Предлагает ли сама инфраструктура модульного тестирования что-то для планирования проверки в конце цикла обработки событий?Или любые меры, чтобы пройти этот юнит-тест, не прибегая к чему-то вроде await Future.value(null);?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...