Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Teste apresenta exception para o FeatureItem

Boa tarde à todos!

Executo o teste conforme o curso, porém o segundo tesde de widget, que verifica se é apresentada funcionalidade de Transferência quando dashboard é aberto, me apresenta erro. Como posso estar corrigindo? A exception:

Verifica se é apresentada funcionalidade de Transferência quando dashboard é aberto:

══╡ EXCEPTION CAUGHT BY FLUTTER TEST FRAMEWORK ╞════════════════════════════════════════════════════
The following TestFailure object was thrown running a test:
  Expected: exactly one matching node in the widget tree
  Actual: _AncestorFinder:<2 widgets with type "FeatureItem" which is an ancestor of icon
  Actual: _AncestorFinder:<2 widgets with type "FeatureItem" which is an ancestor of icon
"IconData"

O teste, no arquivo dashboard_widget_test:

testWidgets('Verifica se é apresentada funcionalidade de Transferência quando dashboard é aberto', (tester) async {
    await tester.pumpWidget(MaterialApp(home: Dashboard()));
    final iconTransferFeatItem = find.widgetWithIcon(FeatureItem, Icons.monetization_on);
    expect(iconTransferFeatItem, findsOneWidget);

    final nameTransferFeatItem = find.widgetWithText(FeatureItem, 'Transfer');
    expect(nameTransferFeatItem, findsOneWidget);
  });

A classe, no arquivo dashboard:

class FeatureItem extends StatelessWidget {
  final String name;
  final IconData icon;
  final Function onClick;

  FeatureItem(this.name, this.icon, {@required this.onClick});

  @override
  Widget build(BuildContext context) {
    return Padding(
      padding: const EdgeInsets.all(8.0),
      child: Material(
        color: Theme.of(context).primaryColor,
        child: InkWell(
          onTap: () => onClick(),
          child: Container(
            padding: EdgeInsets.all(8.0),
            height: 100,
            width: 150,
            color: Theme.of(context).primaryColor,
            child: Column(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              crossAxisAlignment: CrossAxisAlignment.start,
              children: <Widget>[
                Icon(
                  Icons.monetization_on, 
                  color: Colors.white,
                  size: 24.0,
                ),
                Text(
                  name,
                  style: TextStyle(
                    color: Colors.white,
                    fontSize: 16.0, 
                  ),
                )
              ],
            )
          ),
        ),
      ),
    );
  }
}
1 resposta
solução!

Fui seguindo o curso e deu certo quando foi refatorado o código, extraindo o que se repetia para um método, o featureItemMatcher. Atenção também ao fechamento das chaves, o featureItemMatcher não pertence ao escopo da função main. Segue código funcionando:

import 'package:bytebank/main.dart';
import 'package:bytebank/screens/dashboard.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';

void main() {
  testWidgets('Verifica se é apresentada na tela imagem principal quando dashboard é aberto', (WidgetTester tester) async {
    await tester.pumpWidget(MaterialApp(home: Dashboard()));
    final mainImage = find.byType(Image);
    expect(mainImage, findsOneWidget);
  });

  testWidgets('Verifica se é apresentada funcionalidade de Transferência quando dashboard é aberto', (tester) async {
    await tester.pumpWidget(MaterialApp(home: Dashboard()));
    final transferFeatureItem = find.byWidgetPredicate((widget) => featureItemMatcher(widget, 'Transfer', Icons.monetization_on));
    expect(transferFeatureItem, findsOneWidget);
  });

  testWidgets('Verifica se é apresentada funcionalidade de Transação quando dashboard é aberto', (tester) async {
    await tester.pumpWidget(MaterialApp(home: Dashboard()));
    final transactionFeedFeatureItem = find.byWidgetPredicate((widget) => featureItemMatcher(widget, 'Transaction Feed', Icons.description));
    expect(transactionFeedFeatureItem, findsOneWidget);
  });
}
bool featureItemMatcher(Widget widget, String name, IconData icon) {
  if(widget is FeatureItem) {
    return widget.name == name &&
    widget.icon == icon;
  }
  return false;
}

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software