Я тестирую код Flutter/Dart с поставщиком AsyncValue. Я использую пример Андреа почти буквально. Мой слушатель расширяет Mock, но когда я проверяю его, тест завершается неудачно с сообщением «Используется на объекте, отличном от Mockito».
О каком объекте, не являющемся мокито, идет речь? Мой слушатель — издеватель.
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:riverpod/riverpod.dart';
// a generic Listener class, used to keep track of when a provider
// notifies its listeners
class Listener<T> extends Mock {
void call(T? previous, T next);
}
void main() {
group('GeoData', () {
// This is a variation of Andrea's AuthController example minus the
// extra mock'ed AuthRepository dependency.
// https://codewithandrea.com/articles/unit-test-async-notifier-riverpod/
test('initialization with default GeoInfo data', () {
final container = ProviderContainer();
addTearDown(container.dispose);
final listener = Listener<AsyncValue<GeoInfo>>();
container.listen(geoDataProvider, listener, fireImmediately: true);
// ---> this is the line that fails the test with "Used on a non-mockito object"
verify(() => listener(null, const AsyncData<GeoInfo>(GeoInfo.empty())));
verifyNoMoreInteractions(listener);
});
});
}
'''





Да, я потратил на это слишком много времени и прошел не одну кроличью нору, прежде чем нашел ее. Это не имеет ничего общего с неправильной инициализацией макета, а также с разницей между макетом и макетом 🤦♀️
Эти два пакета очень похожи, но синтаксис вызова проверки отличается.
Моктейль:
verify(() => listener(null, const AsyncData<GeoInfo>(GeoInfo.empty())));
Мокито:
verify(listener.call(null, const AsyncData<GeoInfo>(GeoInfo.empty()))).called(1);
Как только я изменил свой вызов на синтаксис Mockito, тест прошел, как и ожидалось.
Ух ты, ты сэкономил мне время. Большое спасибо.