• 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
service_mocker.dart 1.42 KB