Thanks lowery for writing this tutorial. can you write another advanced Testing tutorial?
Thank you for writing in and expressed your interest to learn more about Flutter Testing. I am almost done with Flutter Widget Testing which should be released in a few weeks time!
If you have specific topics of interests to you, please list it down so that I can try to accommodate them in my next tutorial
Looking forward to the new tutorial as well.
Looking forward to hear all your feedbacks after publishing it as well
Hello @lawrey, I am hoping I can get some guidance on what /i might be doing wrong when I try to test a widget in my App.
I am just getting started with unit testing in Flutter, and I have hit a bit of a wall. I have a fairly simple app located here:
The app is essentially a list view of events where you can tap on one to read more details about the event.
I have two screens for this:
events_screen.dart for the list view, and
event_screen.dart for the details. I have been trying to write my tests in
My testing difficulties are with the events screen (the list view). After running
await tester.pumpWidget(MaterialApp(home: EventsScreen()) I can use
find.text('Events') for example to find the title in the AppBar, but I cannot find any of the elements that make up the list.
To clarify further. I am using
get_it as a serviceLocator to get the viewModel for the EventsScreen when it loads. The viewModel is the
ChangeNotifierProvider, and EventsScreen contains a
Consumer to update the list. in EventsScreen
initState(), it calls loadEvents() on the viewModel. After loadEvents() is done, the viewModel calls notifyListeners(), so that EventsScreen can update.
How do I ensure that all these steps occur so that I can properly test if the EventsScreen is rendering properly?
I could be approaching this all wrong, so any advice is appreciated.
I have solved my problem, but perhaps someone can shed some light on this. In the end I executed:
await tester.pumpWidget(MaterialApp(home: EventsScreen(),));
// followed immediately by this second pump without arguments
At this point, the Widget tree was complete and I could create Finders as I hoped and could run all my expect statements without issue.
I am not sure exactly why this works though.
Hey @chuck_taylor, sorry for the late response. If I understand your issue correctly, you were facing issues finding elements to interact within your test suite.
What you did is the right approach, pumpWidget calls
runApp, and also trigger a frame to paint the app. This is sufficient if your UI and data are all provided immediately from the app, or I could call them static data. (i.e., labels and texts)
When you have a structure (i.e. list, collections) with repeated data models,
pump becomes essential to trigger a rebuild since the data-loading process will happen post-
@lawrey Thank you for taking the time to reply. That certainly clarifies why I didn’t have the data from the viewModel until I ran the
pump method a second time. Looking forward to your next article!
This tutorial is more than six months old so questions are no longer supported at the moment for it. Thank you!