Как проверить виджеты, которые опираются на данные, которые были установлены другим виджетом через провайдера? - PullRequest
1 голос
/ 07 ноября 2019

начинающий программист, который только начал изучать флаттер и пытался исследовать тестирование флаттера. Ниже приведен мой код userInfoProvider:

import 'package:flutter/cupertino.dart';

class UserInfoProvider with ChangeNotifier{
  String _username;
  String _userRole;

  getUsername() => _username;
  getUserRole() => _userRole;

  setUsername(String username){
    _username = username;
    notifyListeners();
  }

  setUserRole(String userRole){
    _userRole = userRole;
    notifyListeners();
  }

  getCurrentUserInformation(String uid) async {
    Query q = await Firestore.instance
        .collection('users')
        .document(uid)
        .get()
        .then((DocumentSnapshot ds) {
      setUsername(ds.data['userName']);
      setUserRole(ds.data['userRole']);
      return;
    });
  }

}

У меня есть виджет домашней страницы, который имеет свойство Uid. Этот виджет использует этот uid для идентификации из коллекции «users» в firestore для установки имени пользователя и userRole my UserInfoProvider.

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import 'UserInfoProvider.dart';

class HomePage extends StatefulWidget {
  final String uid;

  HomePage(this.uid);

  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {

  @override
  void afterFirstLayout(BuildContext context) async {
    var user = Provider.of<UserInfoProvider>(context);
    await user.getCurrentUserInformation(widget.uid);
  }

  @override
  Widget build(BuildContext context) {
    return Container();
  }
}

Виджет SecondPage имеет 2 текстовых виджета, которые отображают имя пользователя и userRole из методов get UserInfoProvider.

import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import 'UserInfoProvider.dart';

class SecondPage extends StatefulWidget {
  @override
  _SecondPageState createState() => _SecondPageState();
}

class _SecondPageState extends State<SecondPage> {
  @override
  Widget build(BuildContext context) {
    final user = Provider.of<UserInfoProvider>(context);
    return Column(
      children: <Widget>[
        Text(user.getUsername()),
        Text(user.getUserRole())
      ],
    );
  }
}

В таких сценариях как написать тест виджета, в котором я хотел бы протестировать виджет SecondPage, чтобы убедиться, что отображаемый текст (например, userRole) совпадает с тем, который имитируется UIDвстроили виджет HomePage? Ниже приведен мой тестовый код, который не проходит тест:

    testWidgets("Test secondpage widget to display correct userRole", (WidgetTester tester) async{
      final uid = "ekkMH1sKW1dN0r3ZTQGCngJS1cV2";
      await tester.pumpWidget(ChangeNotifierProvider(
          builder: (_) => UserInfoProvider(),
          child: MaterialApp(
              home: HomePage(uid)
          )
      ));

      await tester.pumpWidget(ChangeNotifierProvider(
          builder: (_) => UserInfoProvider(),
          child: MaterialApp(
              home: SecondPage()
          )
      ));

      final UserRoleTextFinder = find.text("someUserRole");
      expect(UserRoleTextFinder, findsOneWidget);
    });

Я бы предположил, что у меня есть два экземпляра userInfoProvider, состояние которых на домашней странице не совпадает с состоянием SecondPage на основе моего тестового кода? В любом случае ценю любые советы для моего случая.

...