【发布时间】:2019-08-19 14:18:15
【问题描述】:
我正在尝试为 TextField 编写一个测试,其中我使用 IconButton 作为 TextField 的 suffixIcon,以便在按下时切换 TextField 的 obscureText 属性。小部件本身按预期工作,但我在进行测试时遇到了困难。
代码示例:
password_field.dart
import 'package:flutter/material.dart';
import 'package:app/util/app_theme.dart';
import 'package:app/widgets/inputs/text_validator.dart';
class PasswordField extends StatefulWidget {
final bool showValidator;
final ValueChanged<String> onChanged;
final String errorText;
PasswordField({
this.errorText,
@required this.onChanged,
this.showValidator = true,
});
@override
_PasswordFieldState createState() => _PasswordFieldState();
}
class _PasswordFieldState extends State<PasswordField> {
String _password;
bool _shouldHidePassword = true;
void _onChangedPassword(String password) {
setState(() {
_password = password;
});
widget.onChanged(password);
}
void _togglePasswordVisibility() {
setState(() {
_shouldHidePassword = !_shouldHidePassword;
});
}
@override
Widget build(BuildContext context) {
return Column(
children: <Widget>[
TextField(
onChanged: _onChangedPassword,
decoration: _buildInputDecoration(),
obscureText: _shouldHidePassword,
),
],
);
}
InputDecoration _buildInputDecoration() {
return InputDecoration(
suffixIcon: IconButton(
icon: Icon(
_shouldHidePassword ? CustomIcons.eye_show : CustomIcons.eye_hide),
onPressed: _togglePasswordVisibility,
),
labelText: 'Password',
);
}
}
password_field_test.dart
testWidgets('should show an eye that obscures/unobscures the typed values', (WidgetTester tester) async {
// buildWidget just wraps target in a MediaQuery/Directionality/Material
Widget field = buildWidget(PasswordField(onChanged: (_) {}));
String testPW = 'passwordtotest';
await tester.pumpWidget(field);
expect(find.byType(TextField), findsOneWidget);
await tester.enterText(find.byType(TextField), testPW);
await tester.pump();
// These are what I've tried so far
expect(find.text('•' * testPW.length), findsOneWidget)
expect(find.byElementType(TextSpan))
await tester.tap(find.byType(IconButton));
await tester.pump();
expect(find.text(testPW), findsOneWidget);
});
});
到目前为止,我已经尝试按照 Flutter 小部件测试文档进行操作,但我无法通过 find.text('demopassword'); 找到隐藏/未隐藏的文本
我也没有成功地尝试为底层的 EditableText 和 TextSpan 使用查找器,但我不知道如何定位文本值,即使我能够找到它们。我该怎么做?
【问题讨论】:
-
也许这里展示的从 TextField 小部件获取文本内容的技术 (stackoverflow.com/a/54236046/85472) 在这种情况下也适用于您?
标签: flutter dart flutter-test