• Ian Hickson's avatar
    Refactor the test framework (#3622) · 91dd9699
    Ian Hickson authored
    * Refactor widget test framework
    
    Instead of:
    
    ```dart
      test("Card Collection smoke test", () {
        testWidgets((WidgetTester tester) {
    ```
    
    ...you now say:
    
    ```dart
      testWidgets("Card Collection smoke test", (WidgetTester tester) {
    ```
    
    Instead of:
    
    ```dart
      expect(tester, hasWidget(find.text('hello')));
    ```
    
    ...you now say:
    
    ```dart
      expect(find.text('hello'), findsOneWidget);
    ```
    
    Instead of the previous API (exists, widgets, widget, stateOf,
    elementOf, etc), you now have the following comprehensive API. All these
    are functions that take a Finder, except the all* properties.
    
    * `any()` - true if anything matches, c.f. `Iterable.any`
    * `allWidgets` - all the widgets in the tree
    * `widget()` - the one and only widget that matches the finder
    * `firstWidget()` - the first widget that matches the finder
    * `allElements` - all the elements in the tree
    * `element()` - the one and only element that matches the finder
    * `firstElement()` - the first element that matches the finder
    * `allStates` - all the `State`s in the tree
    * `state()` - the one and only state that matches the finder
    * `firstState()` - the first state that matches the finder
    * `allRenderObjects` - all the render objects in the tree
    * `renderObject()` - the one and only render object that matches the finder
    * `firstRenderObject()` - the first render object that matches the finder
    
    There's also `layers' which returns the list of current layers.
    
    `tap`, `fling`, getCenter, getSize, etc, take Finders, like the APIs
    above, and expect there to only be one matching widget.
    
    The finders are:
    
     * `find.text(String text)`
     * `find.widgetWithText(Type widgetType, String text)`
     * `find.byKey(Key key)`
     * `find.byType(Type type)`
     * `find.byElementType(Type type)`
     * `find.byConfig(Widget config)`
     * `find.byWidgetPredicate(WidgetPredicate predicate)`
     * `find.byElementPredicate(ElementPredicate predicate)`
    
    The matchers (for `expect`) are:
    
     * `findsNothing`
     * `findsWidgets`
     * `findsOneWidget`
     * `findsNWidgets(n)`
     * `isOnStage`
     * `isOffStage`
     * `isInCard`
     * `isNotInCard`
    
    Benchmarks now use benchmarkWidgets instead of testWidgets.
    
    Also, for those of you using mockers, `serviceMocker` now automatically
    handles the binding initialization.
    
    This patch also:
    
    * changes how tests are run so that we can more easily swap the logic
      out for a "real" mode instead of FakeAsync.
    
    * introduces CachingIterable.
    
    * changes how flutter_driver interacts with the widget tree to use the
      aforementioned new API rather than ElementTreeTester, which is gone.
    
    * removes ElementTreeTester.
    
    * changes the semantics of a test for scrollables because we couldn't
      convince ourselves that the old semantics made sense; it only worked
      before because flushing the microtasks after every event was broken.
    
    * fixes the flushing of microtasks after every event.
    
    * Reindent the tests
    
    * Fix review comments
    91dd9699
Name
Last commit
Last update
bin Loading commit data...
dev Loading commit data...
examples Loading commit data...
infra Loading commit data...
packages Loading commit data...
travis Loading commit data...
.travis.yml Loading commit data...
AUTHORS Loading commit data...
CONTRIBUTING.md Loading commit data...
ISSUE_TEMPLATE.md Loading commit data...
LICENSE Loading commit data...
README.md Loading commit data...