MissingStubError при добавлении метода Future в конструктор dart
Я попытался сделать аналогичные шаги в некотором руководстве (блоке) YouTube и отлично работать в производственном коде. В инструкции по блоку показано, что нужно ввести асинхронную функцию в конструктор, но когда я создаю простой тест успеха, возникает ошибка MissingStubError.
Вот пример использования для API запроса (макет):
abstract class UseCase {
Future<List<String>> call();
}
Классы государственного управления:
abstract class TestState {}
class TestStateLoading extends Equatable implements TestState {
const TestStateLoading();
@override
List<Object?> get props => [];
}
class TestStateLoaded extends Equatable implements TestState {
final List<String> tests;
const TestStateLoaded(this.tests);
@override
List<Object?> get props => [tests];
}
class TestStateError extends Equatable implements TestState {
final String error;
const TestStateError(this.error);
@override
List<Object?> get props => [error];
}
Вот Ведущий. Я использую внешнюю библиотеку Rxdart для реактивного программирования (flapMap):
class StreamTestPresenter implements TestPresenter {
final UseCase _useCase;
StreamTestPresenter({required UseCase usecase}) : _useCase = usecase {
loadData();
}
final _controller = StreamController<List<String>>();
Sink<List<String>> get sink => _controller.sink;
@override
Stream<TestState> get testStream => _controller.stream.flatMap(_tests);
Stream<TestState> _tests(List<String> tests) async* {
yield TestStateLoading();
try {
yield TestStateLoaded(tests);
} catch (e) {
yield TestStateError(e.toString());
}
}
Future<void> loadData() async {
final tests = await _useCase.call();
sink.add(tests);
}
}
И тест. В разделе действия я попытался использовать await sut.loadData (); и без него:
@GenerateMocks([UseCase])
void main() {
late StreamTestPresenter sut;
late MockUseCase usecase;
setUp(() {
usecase = MockUseCase();
sut = StreamTestPresenter(usecase: usecase);
when(usecase.call()).thenAnswer((_) async => ['a', 'b', 'c']);
});
test('Should emit correct events on UseCase success', () async {
//arrange
final stream = sut.testStream;
//assert
expectLater(
stream,
emitsInOrder([
const TestStateLoading(),
const TestStateLoaded(['a', 'b', 'c']),
]),
);
//act
});
}
Вот ошибка:
MissingStubError: 'call'
No stub was found which matches the arguments of this method call:
call()
Add a stub for this method using Mockito's 'when' API, or generate the mock for MockUseCase with 'returnNullOnMissingStub: true'.
package:mockito/src/mock.dart 190:7 Mock._noSuchMethod
package:mockito/src/mock.dart 184:45 Mock.noSuchMethod
test\stream_test_presenter_test.mocks.dart 29:14 MockUseCase.call
package:stub_problem/stream_test_presenter.dart 33:34 StreamTestPresenter.loadData
package:stub_problem/stream_test_presenter.dart 13:5 new StreamTestPresenter
test\stream_test_presenter_test.dart 17:11 main.<fn>
===== asynchronous gap ===========================
dart:async _completeOnAsyncError
package:stub_problem/stream_test_presenter.dart StreamTestPresenter.loadData
package:stub_problem/stream_test_presenter.dart 13:5 new StreamTestPresenter
test\stream_test_presenter_test.dart 17:11 main.<fn>
Замечания: когда я удаляю функцию в конструкторе и применяю тест в разделе действия с помощью await sut.loadData (); работает отлично.