没有找到与此方法调用的参数匹配的存根:navigator



我试图模拟AutoRouteObserver()类来测试我的项目中的导航,但是当我在navigatorobserver参数中使用模拟实例时,我有以下错误:

══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
The following MissingStubError was thrown building AutoRouteNavigator(state:
_AutoRouteNavigatorState#0b446):
'navigator'
No stub was found which matches the arguments of this method call:
navigator
Add a stub for this method using Mockito's 'when' API, or generate the mock for
MockNavigationHistoryObserver with 'returnNullOnMissingStub: true'.
The relevant error-causing widget was:
AutoRouteNavigator 
下面是我的代码:
void main() async {
var authManagerMock = getAndRegisterAuthManagerMock();
var mockRepository = getAndRegisterRepositoryMock();
final _appRouter = AppRouterAutoRoute(authGuard: AuthGuard());
var mockAutoRouterObserver = MockAutoRouteObserver();
Widget makeTestableWidget() {
when(authManagerMock.isLoggedIn()).thenAnswer((realInvocation) => false);
return MaterialApp.router(
routerDelegate: AutoRouterDelegate(_appRouter, navigatorObservers: () => [mockAutoRouterObserver]),
routeInformationParser: _appRouter.defaultRouteParser());
}
testWidgets('Tapping forgot password text', (WidgetTester tester) async {
await tester.pumpWidget(makeTestableWidget());
await tester.pump();
Finder forgetPasswordButtonFinder = find.byKey(Key('forget-password-button'));
expect(find.byKey(Key('forget-password-button')), findsOneWidget);
await tester.tap(forgetPasswordButtonFinder);
await tester.pumpAndSettle();
expect(find.byKey(Key('forget-password-button')), findsNothing);
expect(find.byKey(Key('submit')), findsOneWidget);
verify(mockAutoRouterObserver.didPush(any, any));
});
}

您需要确保Mockito可以找到相关的mock。我就是这么做的。首先,将MockSpec添加到您的@GenerateMocks或@GeneratorNiceMocks代码中,使用如下的符号

@GenerateNiceMocks([
MockSpec<AuthService>(),
// ...
MockSpec<MockRouter>(as: Symbol('MockAppRouter'))
])

然后定义Mock和我们需要让它为我们模拟的实现

// workaround to get Mockito to generate StackRouter mocks
class MockRouter extends Mock implements AppRouter, StackRouter {}

然后在shell中运行build_runner,让mockito生成mock。

dart run build_runner build
这应该会自动生成大量的模拟代码,看起来像这样:
class MockAppRouter extends _i1.Mock implements _i37.MockRouter {
@override
List<_i8.AutoRoute> get routes => (super.noSuchMethod(
Invocation.getter(#routes),
returnValue: <_i8.AutoRoute>[],
returnValueForMissingStub: <_i8.AutoRoute>[],
) as List<_i8.AutoRoute>);
@override
_i8.RouteType get defaultRouteType => (super.noSuchMethod(
...

然后在您的测试中,像这样验证您的approouter调用。我们使用get_it将approouter的实际实现与模拟实现交换,但是有多种方法可以做到这一点。

verify(appRouter.push(SignUpViewRoute())).called(1);

最新更新