如何解决如何为 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 举报,一经查实,本站将立刻删除。