Gostaria de fazer uma sugestão: no final do projeto, a forma implementada foi utilizar diretamente o método da API do main.dart até chegar ao FutureBuilder() no header.dart.
Sabemos que uma aplicação comercial pode possuir dezenas de APIs e, à medida que o projeto cresce, seria inviável passar cada parâmetro de cima para baixo até os filhos.
Portanto, o que eu fiz foi criar uma classe abstrata BankHttpService
e implementá-la apenas na classe BankHttp
existente:
@GenerateMocks([BankHttp])
abstract class BankHttpService {
Future<String> dolarToReal();
}
class BankHttp implements BankHttpService {
@override
Future<String> dolarToReal() async {
...
E no código main.dart
class MyApp extends StatelessWidget {
MyApp({Key? key}) : super(key: key);
final BankHttpService bankHttpService = BankHttp(); //// mudança foi aqui
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: purpleTheme,
home: BankInherited(
child: Home(
bankHttpService: bankHttpService, // mudança foi aqui
)),
);
}
}
Precisamos alterar o home.dart e o header.dart para receber o parâmetro this.bankHttpService
em vez de this.api
No header, em FutureBuilder, é onde chamamos o método dolarToReal(), e não no main como antes:
FutureBuilder(
// future: widget.api,
future: widget.bankHttpService.dolarToReal(),
E, por fim, o teste unitário (home_test.dart) mudou nessa linha:
home: BankInherited(
// child: Home(api: httpMock.dolarToReal()),
child: Home(bankHttpService: httpMock),
),
Além disso, eu mudaria o teste unitário 'Testing MockHttp dolarToReal'
onde estamos verificando o número fixo de 5 vezes de chamadas do método:
Nesse cenário o ideal seria qualquer valor "maior que 0".
verify(httpMock.dolarToReal()).called(greaterThan(0));
Espero poder ter ajudado :)