Я пытаюсь протестировать функцию asyn c, которая вернет Future со значением bool. Но когда код попадает туда, где я издевался над вызовом, я получаю следующую ошибку:
Неудачное утверждение: логическое выражение не должно быть нулевым
Когда было создано исключение, это был стек: # 0 _NavigationControlsState.canGoBack
Есть идеи? Что я здесь делаю не так?
Вот мой код виджета:
class NavigationControls extends StatefulWidget {
final WebViewController _webViewController;
final bool _isWebViewReady;
const NavigationControls(this._webViewController, this._isWebViewReady);
_NavigationControlsState createState() => _NavigationControlsState();
}
class _NavigationControlsState extends State<NavigationControls> {
bool _isBackButtonDisabled;
@override
void initState() {
super.initState();
_isBackButtonDisabled = true;
}
canGoBack(WebViewController controller) async {
await controller.canGoBack()
? setState(() => _isBackButtonDisabled = false)
: setState(() => _isBackButtonDisabled = true);
}
@override
Widget build(BuildContext context) {
final WebViewController controller = widget._webViewController;
final isWebViewReady = widget._isWebViewReady;
if (isWebViewReady) {
canGoBack(controller);
}
return IconButton(
key: new Key('back'),
icon: const Icon(Icons.arrow_back_ios),
onPressed: _isBackButtonDisabled
? null
: () async {
await controller.goBack();
});
}
}
И вот моя тестовая попытка:
class MockWebViewController extends Mock implements WebViewController {}
void main() {
WebViewController controller;
setUp(() {
controller = new MockWebViewController();
});
testWidgets('test widget created successfully', (WidgetTester tester) async {
await tester.pumpWidget(MyApp());
expect(find.byType(WebView), findsOneWidget);
expect(find.byType(NavigationControls), findsOneWidget);
});
testWidgets('test navigation buttons when enabled',
(WidgetTester tester) async {
await tester.pumpWidget(NavigationControls(controller, true));
when(controller.canGoBack()).thenAnswer((_) => Future.value(true));
await tester.tap(find.byKey(new Key('back')));
verify(controller.goBack()).called(1);
});
}