Integration test Flutter: How to press keys from keyboard in a app , at the very last step - flutter

**At the very last bold step please help me with the code every thing is working and at the stage of keyboard it is not working
testWidgets('アカウントをお持ちの方はこちら', (WidgetTester tester) async {
await app.main();
await tester.pumpAndSettle();
await tester.pumpAndSettle(const Duration(seconds: 2));
expect(find.text('アカウントをお持ちの方はこちら'), findsOneWidget);
Finder signinbutton = find.text('アカウントをお持ちの方はこちら');
await tester.tap(signinbutton);
await tester.pumpAndSettle();
expect(find.text('ログイン画面へ'), findsOneWidget);
Finder loginbutton = find.text("ログイン画面へ");
await tester.tap(loginbutton);
await tester.pumpAndSettle();
expect(find.text('携帯電話番号'), findsOneWidget);
Finder mobilenumber = find.text("携帯電話番号");
await tester.tap(mobilenumber);
await tester.pumpAndSettle(const Duration(seconds: 2));
**expect(find.text('携帯電話番号'), findsOneWidget);
Finder textBoxForPhone = find.text('携帯電話番号');
await tester.enterText(textBoxForPhone, '08009090909');
await tester.tap(textBoxForPhone);
await tester.pumpAndSettle();**
});
}

Related

How to wait until the Finder is visible for next code execution in Flutter integration test?

Information:
I have created a sample Flutter unit test to test the login screen where I have email & password as input field and a login button.
Requirement:
Need to test false cases and for that, I have written code as per the below steps.
Open main.dart
Filled the email & password field
onTap event is done on the login button. Over here API will be called and loader is displayed on the screen until API gets a success or failure response.
Need to check if failure dialog is displayed with a message.
Issue/Query:
Now when the API is calling I want to wait when the loader is visible until the loader is gone. So, as of now I just put a manual delay to execute the next code but I want to make it dynamic. So, let me know how we can put dynamic delay based on the loader visible?
Code:
void main() {
group('App Test', () {
IntegrationTestWidgetsFlutterBinding.ensureInitialized();
testWidgets('Login Fail Test', (WidgetTester tester) async {
await app.main();
await tester.pumpAndSettle();
await tester.pump(new Duration(seconds: 2));
final emailField = find.byType(TextFormField).first;
final passwordField = find.byType(TextFormField).last;
final loginButton = find.byType(RaisedButton).first;
await tester.enterText(emailField, 'Test');
await tester.pumpAndSettle();
await tester.pump(new Duration(seconds: 1));
await tester.enterText(passwordField, 'Test123');
await tester.pumpAndSettle();
await tester.pump(new Duration(seconds: 1));
await tester.tap(loginButton);
await tester.pumpAndSettle();
await tester.pump(new Duration(seconds: 3));
final dialog = find.byType(AlertDialog).first;
await tester.element(dialog);
await tester.pumpAndSettle();
await tester.pump(new Duration(seconds: 1));
final dialogButton = find.byType(FlatButton).first;
await tester.tap(dialogButton);
await tester.pumpAndSettle();
await tester.pump(new Duration(seconds: 2));
});
}
I have a file called utils.dart for functionality like this. In this case I use the following function which will basically poll until the finder is valid
// utils.dart
Future<void> pumpUntilFound(
WidgetTester tester,
Finder finder, {
Duration timeout = const Duration(seconds: 10),
}) async {
bool timerDone = false;
final timer = Timer(timeout, () => timerDone = true);
while (timerDone != true) {
await tester.pump();
final found = tester.any(finder);
if (found) {
timerDone = true;
}
}
timer.cancel();
}
You can also make it throw an exception if it times out, but the error messages aren't helpful, so I usually follow it up with an expect
It would look like
// my_test.dart
final fab = find.byKey(const ValueKey('fab'));
await pumpUntilFound(widgetTester, fab);
expect(fab, findsOneWidget);
Try wrapping like this:
testWidgets('test',
(WidgetTester tester) async {
await tester.runAsync(() async {
// test code here
});
});
If you use:
await tester.pumpAndSettle();
And then:
final widget = find.byKey(Key('whatever'));
It will find dinamically

mockObserver.didPush can not using type any in didPush

Hi I'm trying to verify mockObserver to check push to other screen. But when didPush(any,any), it's show err from type any.
I'm using mockito: ^5.0.13
(tester) async {
await tester.pumpWidget(widget);
await tester.tap(find.widgetWithText(TextButton, 'Join with us'));
await tester.pumpAndSettle();
verify(mockObserver.didPush(any, any));
});

Hit the the enter/done/return button in Flutter integration test after enter a text

await tester.enterText(mySearchField, 'my search text');
await tester.showKeyboard(mySearchField);
await tester.sendKeyDownEvent(LogicalKeyboardKey.enter);
// do something to wait for 2 seconds
await tester.pumpAndSettle();
await Future.delayed(const Duration(seconds: 10), () {});
I'am trying to hit the done/enter/submit button on the virtual keyboard after enter a text in a search field..
how to do that, and how to wait for the result (async request)...
await simulateKeyDownEvent(LogicalKeyboardKey.accept);

How to generate keyboard Event ENTER on a TextField in flutter_driver Tests

I am writing an integration test using flutter_driver for searching using text field I have to enter(Keyboard Event) after entering text, I cannot find any solution to generate keyboard event in flutter_Driver, is there any solution to this?
test('search tests, search a user by name', () async {
print('Waiting for join now button');
print('search test started');
await driver.clearTimeline();
print('pause for 5 sec');
await Future.delayed(Duration(seconds: 5));
print('Tapping search field');
await driver.waitFor(searchbar.searchFieldFinder);
await driver.tap(searchbar.searchFieldFinder);
print('enter user searching');
await driver.enterText('Test user');
//**Enter Keyboard Event here**
}, timeout: Timeout(Duration(minutes: 2)));
For keyboard event ENTER in integration tests you can use this code:
await tester.tap(find.byType(TextField));
await tester.enterText(find.byType(TextField), text);
await tester.testTextInput.receiveAction(TextInputAction.done);
await tester.pumpAndSettle(Duration(seconds: 1));
I don't know if it applies to driver tests, but in widget tests you can use the tester.sendKeyDownEvent() function like so:
await tester.sendKeyDownEvent(LogicalKeyboardKey.enter);
await tester.pumpAndSettle();
I would imagine that it would translate over to driver tests like this:
await driver.sendKeyDownEvent(LogicalKeyboardKey.enter);
await driver.pumpAndSettle();

Write Test for Flutter FutureBuilder

In my app after press button it's opening another screen, a form (StatefulWidget) which is loading from FutureBuilder. I need to write test class for this,
But in log it says when executing form is not finished build. This is test code,
await tester.tap(find.byIcon(Icons.add));
await tester.pump(const Duration(seconds: 1));
await tester.runAsync(() async {
when(tester.tap(find.byKey(Key("add_new_form")))).thenAnswer((_) => Future.delayed(Duration(seconds: 30), () => []));
await tester.pumpAndSettle(Duration(seconds: 10), EnginePhase.build, Duration(minutes: 1));
await tester.pump();
await tester.pump(const Duration(seconds: 1));
await tester.pump(const Duration(seconds: 1));
expect(find.byKey(Key("form")), findsOneWidget);
});
how to write test class for flutter FutureBuilder ?? I have seen two questions relates to FutureBuilder but they are different from my situation. Any help would be appreciated.