Отсутствует ошибка заглушки на 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)