如何为 statefulwidget 创建小部件测试

问题描述

我有 3 个不同的文件/屏幕(主、登录注册),其中登录注册是 statefulwidgtes。我想在屏幕中执行小部件测试,但是,似乎我无法在登录注册获取小部件,每次尝试时我都会收到消息:

预期:小部件树中正好有一个匹配的节点 实际:_WidgetTypeFinder: 其中:表示没有找到,但预期有一个

请注意,在上面的示例中,ListView 小部件实际上存在,但未被测试人员定位。

这是主要部件的代码

import "package:Flutter/material.dart";
import 'package:loginscreen/setup/login.dart';
import 'package:firebase_core/firebase_core.dart';
// void main() => runApp(MyApp());

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
        theme: ThemeData(primarySwatch: Colors.blue),home: LoginPage());
  }
}

登录页面代码

import 'package:Flutter/material.dart';
import './signup.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:loginscreen/pages/home.dart';
import 'package:modal_progress_hud/modal_progress_hud.dart';

class LoginPage extends StatefulWidget {
  LoginPage({Key key}) : super(key: key);

  @override
  State<StatefulWidget> createState() => new _State();
}

class _State extends State<LoginPage> {
  TextEditingController nameController = TextEditingController();
  TextEditingController passwordController = TextEditingController();
  String email;
  String password;
  final _auth = FirebaseAuth.instance;
  bool showSpinner = false;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Sign In'),),body: ModalProgressHUD(
        inAsyncCall: showSpinner,child: Padding(
          padding: EdgeInsets.all(10),child: ListView(
            children: <Widget>[
              Container(
                  alignment: Alignment.center,padding: EdgeInsets.all(10),child: Text(
                    'Firebase Authentication',style: TextStyle(
                        color: Colors.blue,fontWeight: FontWeight.w500,fontSize: 30),)),Container(
                padding: EdgeInsets.all(10),child: TextField(
                  keyboardType: TextInputType.emailAddress,onChanged: (value) {
                    email = value;
                  },controller: nameController,decoration: Inputdecoration(
                    border: OutlineInputBorder(),labelText: 'Email Address',Container(
                padding: EdgeInsets.fromLTRB(10,10,0),child: TextField(
                  onChanged: (value) {
                    password = value;
                  },obscureText: true,controller: passwordController,labelText: 'Password',TextButton(
                onpressed: () {
                  //forgot password screen
                },// textColor: Colors.blue,child: Text('Forgot Password'),Container(
                height: 50,padding: EdgeInsets.fromLTRB(10,// ignore: deprecated_member_use
                child: RaisedButton(
                  textColor: Colors.white,color: Colors.blue,child: Text('Login'),onpressed: () async {
                    setState(() {
                      showSpinner = true;
                    });
                    try {
                      await _auth.signInWithEmailAndPassword(
                          email: email,password: password);
                      setState(() {
                        showSpinner = true;
                      });
                      Navigator.push(
                        context,MaterialPageRoute(
                          builder: (context) => WelcomePage(),);
                    } on FirebaseAuthException catch (e) {
                      if (e.code == 'user-not-found') {
                        print('No user found for that email.');
                      } else if (e.code == 'wrong-password') {
                        print('Wrong password provided for that user.');
                      }
                    }
                  },Container(
                  child: Row(
                children: [
                  Text('Don\'t not have account?'),// ignore: deprecated_member_use
                  FlatButton(
                    textColor: Colors.blue,child: Text(
                      'Sign Up',style: TextStyle(fontSize: 20),onpressed: () {
                      Navigator.push(
                        context,MaterialPageRoute(builder: (context) => SignupPage()),);
                    },)
                ],mainAxisAlignment: MainAxisAlignment.center,))
            ],);
  }
}

注册页面代码

import 'package:Flutter/material.dart';
import './login.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:loginscreen/pages/home.dart';
import 'package:modal_progress_hud/modal_progress_hud.dart';

class SignupPage extends StatefulWidget {
  @override
  State<StatefulWidget> createState() => new _State();
}

class _State extends State<SignupPage> {
  TextEditingController nameController = TextEditingController();
  TextEditingController passwordController = TextEditingController();
  final _auth = FirebaseAuth.instance;
  String email;
  String password;
  String repeatpassword;
  bool showSpinner = false;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: Text('Login Screen App'),body: ModalProgressHUD(
            inAsyncCall: showSpinner,child: Padding(
                padding: EdgeInsets.all(10),child: ListView(
                  children: <Widget>[
                    Container(
                        alignment: Alignment.center,child: Text(
                          'Firebase Authentication',style: TextStyle(
                              color: Colors.blue,Container(
                      padding: EdgeInsets.all(10),child: TextField(
                        keyboardType: TextInputType.emailAddress,onChanged: (value) {
                          email = value;
                        },decoration: Inputdecoration(
                          border: OutlineInputBorder(),Container(
                      padding: EdgeInsets.fromLTRB(10,child: TextField(
                        onChanged: (value) {
                          password = value;
                        },labelText: 'Password (must be at least 6 characters)',child: TextField(
                        onChanged: (value) {
                          repeatpassword = value;
                        },labelText: 'Repeat Password',TextButton(
                      onpressed: () {
                        //forgot password screen
                      },Container(
                      height: 50,child: ElevatedButton(
                        // textColor: Colors.white,// color: Colors.blue,child: Text('Sign Up'),onpressed: () async {
                          setState(() {
                            showSpinner = true;
                          });
                          try {
                            // UserCredential userCredential =
                            await _auth.createuserWithEmailAndPassword(
                                email: email,password: password);
                            setState(() {
                              showSpinner = false;
                            });
                            Navigator.push(
                              context,MaterialPageRoute(
                                builder: (context) => WelcomePage(),);
                          } on FirebaseAuthException catch (e) {
                            if (e.code == 'weak-password') {
                              print('The password provided is too weak.');
                            } else if (e.code == 'email-already-in-use') {
                              print(
                                  'The account already exists for that email.');
                            }
                          } catch (e) {
                            print(e);
                          }
                        },Container(
                        child: Row(
                      children: <Widget>[
                        Text('Already have an account?'),// ignore: deprecated_member_use
                        FlatButton(
                          textColor: Colors.blue,child: Text(
                            'Sign in',onpressed: () {
                            Navigator.push(
                              context,MaterialPageRoute(
                                  builder: (context) => LoginPage()),);
                          },)
                      ],))
                  ],))));
  }
}

登录页面小部件测试(这不起作用):

import 'package:Flutter/material.dart';
import 'package:Flutter_test/Flutter_test.dart';
import 'package:loginscreen/setup/login.dart';

void main() {
  testWidgets(' ',(WidgetTester tester) async {
    // add it to the widget tester
    await tester.pumpWidget(LoginPage());

    expect(find.byType(Text),findsOneWidget);
    
  });
}

所以我的问题是,如何测试登录注册有状态的小部件?如何在这些屏幕中获取小部件?flu

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)