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 (); работает отлично.

0 ответов

Другие вопросы по тегам