Под модульным тестом подразумевается, что после того, как какой-либо элемент был передан объекту 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);
?