Рецепты
Ожидание событий жизненного цикла
Замените фиксированные задержки наблюдателем, который завершается при выполнении смыслового условия.
Ожидание событий жизненного цикла
Фиксированная задержка доказывает только то, что машина подождала. Она не называет событие, после которого проверка безопасна, и становится нестабильной при изменении планирования.
Назовите конечное условие
useCaseTest<CounterUseCase, CounterState>(
'increment publishes and completes',
build: CounterUseCase.new,
act: (useCase) => useCase.add(const IncrementCommand()),
waitFor: (useCase, observer) =>
observer.waitForHistory(hasLength(1)),
expectedHistory: () => <Object?>[
isTerminalUseCaseExecutionEntry<IncrementCommand>(
result: UseCaseExecutionResult.completed,
),
],
);
Сценарий продолжается, когда в конечной истории появляется одна запись. Он не предполагает длительность и не угадывает количество микрозадач обработчика.
Используйте наблюдатель для нескольких команд
final observer = UseCaseTestObserver<OrderState>(useCase);
addTearDown(() async {
await useCase.close();
await observer.cancel();
});
useCase
..add(const LoadOrder('a'))
..add(const LoadOrder('b'));
await observer.waitForHistory(hasLength(2));
Наблюдатель доступен только для чтения. Его отмена останавливает тестовую подписку, но не закрывает и не отменяет UseCase.
Управляйте временными политиками
Используйте TestUseCaseClock для Debounce, Throttle, Rate Limit и временных меток жизненного цикла. Продвиньте часы до границы политики, затем дождитесь смыслового события. Так моделируемое время отделяется от завершения и не зависит от скорости машины.