【问题标题】:WidgetTest navigation in flutter with mockito not workingWidgetTest 导航随着 mockito 不工作而颤动
【发布时间】:2020-01-02 15:34:48
【问题描述】:

flutter 测试的超级新手。我不明白为什么我在

上收到以下错误

verify(mockNavigationObserver.didPush(any, any));

════════════════════════════════════════════════════════════════════════════════════════════════╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞════════════════════════════════════════════════════
The following TestFailure object was thrown running a test:
  No matching calls (actually, no calls at all).
(If you called `verify(...).called(0);`, please instead use `verifyNever(...);`.)

When the exception was thrown, this was the stack:
#0      fail (package:test_api/src/frontend/expect.dart:153:30)
#1      _VerifyCall._checkWith (package:mockito/src/mock.dart:648:7)
#2      _makeVerify.<anonymous closure> (package:mockito/src/mock.dart:935:18)
#3      main.<anonymous closure>.<anonymous closure> (file:<my_project_path>/test/navigation_test.dart:53:13)
<asynchronous suspension>
#4      testWidgets.<anonymous closure>.<anonymous closure> (package:flutter_test/src/widget_tester.dart:124:25)
#5      TestWidgetsFlutterBinding._runTestBody (package:flutter_test/src/binding.dart:696:19)
<asynchronous suspension>
#8      TestWidgetsFlutterBinding._runTest (package:flutter_test/src/binding.dart:679:14)
#9      AutomatedTestWidgetsFlutterBinding.runTest.<anonymous closure> (package:flutter_test/src/binding.dart:1050:24)
#15     AutomatedTestWidgetsFlutterBinding.runTest (package:flutter_test/src/binding.dart:1047:15)
#16     testWidgets.<anonymous closure> (package:flutter_test/src/widget_tester.dart:121:22)
#17     Declarer.test.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/declarer.dart:171:27)
<asynchronous suspension>
#18     Invoker.waitForOutstandingCallbacks.<anonymous closure> (package:test_api/src/backend/invoker.dart:242:15)
#23     Invoker.waitForOutstandingCallbacks (package:test_api/src/backend/invoker.dart:239:5)
#24     Declarer.test.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/declarer.dart:169:33)
#29     Declarer.test.<anonymous closure> (package:test_api/src/backend/declarer.dart:168:13)
#30     Invoker._onRun.<anonymous closure>.<anonymous closure>.<anonymous closure>.<anonymous closure> (package:test_api/src/backend/invoker.dart:392:25)
#44     _Timer._runTimers (dart:isolate-patch/timer_impl.dart:384:19)
#45     _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:418:5)
#46     _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:174:12)
(elided 28 frames from class _FakeAsync, package dart:async, package dart:async-patch, and package stack_trace)

The test description was:
  StartPage .. LogInButton -> LogIn Screen

下面是我的navigation_test.dart:

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:project/auth/provider/auth_provider.dart';
import 'package:project/auth/screens/start_screen.dart';
import 'package:project/common/config/finders.dart';
import 'package:project/common/config/key_strings.dart';
import 'package:project/common/config/route_config.dart';
import 'package:provider/provider.dart';

// Mock class
class MockNavigatorObserver extends Mock implements NavigatorObserver {}

class MockAuthProvider extends Mock implements AuthProvider {}

void main() {
  group('StartPage navigation tests', () {
    NavigatorObserver mockNavigationObserver;
    AuthProvider mockAuthProvider;

    setUp(() {
      mockNavigationObserver = MockNavigatorObserver();
      mockAuthProvider = MockAuthProvider();
    });

    Widget createWidgetForTesting({Widget child}) {
      return MaterialApp(
        home: child,
        routes: RouteConfig.routes,
      );
    }

    Future<Null> _buildStartScreen(WidgetTester tester) async {
      await tester.pumpWidget(
          ChangeNotifierProvider<AuthProvider>.value(
        value: mockAuthProvider,
        child: createWidgetForTesting(child: StartScreen()),
      ));

      verify(mockNavigationObserver.didPush(any, any));
    }

    Future<Null> _navigateToPageByButtonKey(
        WidgetTester tester, String buttonKey) async {

      Finder buttonFinder = find.byKey(Key(buttonKey));
      expect(buttonFinder, findsOneWidget);

      await tester.tap(buttonFinder);
      await tester.pumpAndSettle();
    }

    testWidgets('StartPage .. RegisterButton -> CreateProfile Screen',
        (WidgetTester tester) async {
      await _buildWidget(tester, StartScreen());
      await _navigateToPageByButtonKey(tester, START_SCREEN_REGISTER_BUTTON_KEY);
      verify(mockNavigationObserver.didPush(any, any));
      expect(find.byKey(Key(CREATE_PROFILE_SCREEN_KEY)), findsOneWidget);
    });
  });
}

【问题讨论】:

    标签: testing flutter dart mockito


    【解决方案1】:

    我没有注册我的 mockNavigation 观察者。我在做事的时候需要少看电视。

        Widget createWidgetForTesting({Widget child}) {
          return MaterialApp(
            home: child,
            routes: RouteConfig.routes,
            navigatorObservers: [mockNavigationObserver],
          );
        }
    

    【讨论】:

      猜你喜欢
      • 2021-06-06
      • 1970-01-01
      • 2018-10-11
      • 2016-05-04
      • 1970-01-01
      • 2019-02-20
      • 1970-01-01
      • 2016-10-23
      • 1970-01-01
      相关资源
      最近更新 更多