Отсутствует ошибка заглушки на mockito во флаттере. Попытка использовать setString на имитируемых SharedPreferences

Я пытаюсь издеваться над sharedPreferences с помощью Mockito в моем проекте flutter. Вот журнал ошибок.

      package:mockito/src/mock.dart 190:7                                                                       Mock._noSuchMethod
package:mockito/src/mock.dart 184:45                                                                      Mock.noSuchMethod
test\feature\number_trivia\data\datasource\number_trivia_local_datasource_test.mocks.dart 67:14           MockSharedPreferences.setString
package:clean_arch_tdd/features/number_trivia/data/datasources/number_trivia_local_datasource.dart 31:30  NumberTriviaLocalDataSourceImpl.cacheLastNumberTrivia
test\feature\number_trivia\data\datasource\number_trivia_local_datasource_test.dart 51:18                 main.<fn>.<fn>

MissingStubError: 'setString'
No stub was found which matches the arguments of this method call:
setString('CACHED_NUMBER_TRIVIA', '{"text":"Test trivia","number":1}')

Add a stub for this method using Mockito's 'when' API, or generate the mock for MockSharedPreferences with 'returnNullOnMissingStub: true'.

Ошибка относится к этой строке кода.

local_data_source_test.dart

      test('should call sharedPreferences to cache the data', () {
      dataSource.cacheLastNumberTrivia(tNumberTriviaModel);
      final expectedJsonString = jsonEncode(tNumberTriviaModel.toJson());
      verify(mockSharedPreferences.setString(
          cachedNumberTrivia, expectedJsonString));
    });

local_data_source.dart

      @override
  Future<void> cacheLastNumberTrivia(NumberTriviaModel triviaToCache) {
    return sharedPreferences.setString(
        cachedNumberTrivia, jsonEncode(triviaToCache.toJson()));
  }

Это показывает, что метод setString из имитируемого sharedPreferences отсутствует. Я уже запустил команду pub для создания макетов. У меня также есть тестовый пример в файле, использующий метод getString. И работает нормально.

Что-то мне не хватает, поэтому я не могу использовать метод setString? Или есть какое решение этой проблемы?

Спасибо заранее.

2 ответа

Я действительно понял это, извините, что не опубликовал ответ сразу.

Я обнаружил, что забыл вызвать заглушку для метода setString. Вот код.

      group('cacheNumberTrivia', () {
    const tNumberTriviaModel =
        NumberTriviaModel(number: 1, text: 'Test trivia');

    test('should call sharedPreferences to cache the data', () async {
      when(mockSharedPreferences.setString(any, any))
          .thenAnswer((_) async => true);
      dataSource.cacheLastNumberTrivia(tNumberTriviaModel);
      final expectedJsonString = jsonEncode(tNumberTriviaModel.toJson());
      verify(mockSharedPreferences.setString(
          cachedNumberTrivia, expectedJsonString));
    });
  });

На самом деле заглушка была этой строкой:

      when(mockSharedPreferences.setString(any, any))
          .thenAnswer((_) async => true);

Я забыл позвонить whenметод перед проверкой результата с помощью verify, поэтому выдает ошибку.

Прочитал документацию библиотеки и ничего не нашел, чтобы решить проблему. Я думаю, что это ошибка в создании макетов.

В любом случае, используйте эти шаги, это решит вашу проблему:

1.Откройте файл number_trivia_local_data_source_test.mocks.dart (если вы сгенерировали его с помощью команды pub)

2. Найдите метод setString.

3. перепишите его:

        @override
  _i3.Future<bool> setString(String? key, String? value) =>
      (super.noSuchMethod(Invocation.method(#setString, [key, value]),
              returnValue: Future<bool>.value(false),
              returnValueForMissingStub: Future<bool>.value(false))
          as _i3.Future<bool>);

Вы заметите, что я добавил новую строку в предыдущий код:

      returnValueForMissingStub: Future<bool>.value(false)
Другие вопросы по тегам