为什么我的 decoration.errorText 返回 null?我是否必须模拟我的集团才能测试我的验证器是否正常工作?
Why is my decoration.errorText returning null? Do i have to mock my bloc to be able to test if my validator is working alright?
我正在尝试做一些小部件测试,但我不知道为什么我的 decoration.errorText 返回 null,尽管在调试时,我看到它进入了 else 条件。
我试过:await tester.pump() 和 await tester.pumpAndSettle()。但是没有任何变化。
StreamBuilder<String>(
stream: _loginBloc.loginStream,
builder: (context, snapshot) => TextField(
controller: _loginController,
onChanged: _loginBloc.updateLogin,
decoration: InputDecoration(
hintText: 'Login',
labelText: 'Login',
errorText: snapshot.error,
),
),
)
Observable<String> get loginStream => _loginController.stream.transform(validateLogin);
final validateLogin = StreamTransformer<String, String>.fromHandlers(
handleData: (login, sink) {
if (login != null && login.trim().isNotEmpty) {
sink.add(login);
} else {
sink.addError(MISSING_DATA);
}
}
);
await tester.pumpWidget(
BlocProviderList(
child: MaterialApp(
home: MyHomePage(title: 'test'),
),
listBloc: [
Bloc(LoginBloc()),
],
),
);
await tester.enterText(finderLogin, 'testing');
await tester.enterText(finderLogin, '');
expect(txtFieldLogin.decoration.errorText, MISSING_DATA); // returning null
在断言之前尝试调用 await tester.pump()
或 await tester.pumpAndSettle()
。
您说代码执行正常,但认为这些更改尚未反映在您的小部件树中,例如,事件在 bloc 流中排队,但尚未在您的小部件中使用。
经过一番研究和测试,我得出了这个解决方案。
LoginBloc bloc = LoginBloc();
// We do this instead of entering the text with await tester.enterText
bloc.updateLogin('');
// Build our app and trigger a frame.
await tester.pumpWidget(
BlocProviderList(
child: MaterialApp(
home: LoginScreen(),
),
listBloc: [
Bloc(bloc),
],
),
);
// Trigget another frame so the textfield is updated with the error info
await tester.pump(Duration.zero);
final txtFields = find.byType(TextField);
final finderLogin = txtFields.at(0);
TextField txtFieldLogin = tester.widget(finderLogin);
expect(txtFieldLogin.decoration.errorText, MISSING_DATA); // working alright!
我正在尝试做一些小部件测试,但我不知道为什么我的 decoration.errorText 返回 null,尽管在调试时,我看到它进入了 else 条件。
我试过:await tester.pump() 和 await tester.pumpAndSettle()。但是没有任何变化。
StreamBuilder<String>(
stream: _loginBloc.loginStream,
builder: (context, snapshot) => TextField(
controller: _loginController,
onChanged: _loginBloc.updateLogin,
decoration: InputDecoration(
hintText: 'Login',
labelText: 'Login',
errorText: snapshot.error,
),
),
)
Observable<String> get loginStream => _loginController.stream.transform(validateLogin);
final validateLogin = StreamTransformer<String, String>.fromHandlers(
handleData: (login, sink) {
if (login != null && login.trim().isNotEmpty) {
sink.add(login);
} else {
sink.addError(MISSING_DATA);
}
}
);
await tester.pumpWidget(
BlocProviderList(
child: MaterialApp(
home: MyHomePage(title: 'test'),
),
listBloc: [
Bloc(LoginBloc()),
],
),
);
await tester.enterText(finderLogin, 'testing');
await tester.enterText(finderLogin, '');
expect(txtFieldLogin.decoration.errorText, MISSING_DATA); // returning null
在断言之前尝试调用 await tester.pump()
或 await tester.pumpAndSettle()
。
您说代码执行正常,但认为这些更改尚未反映在您的小部件树中,例如,事件在 bloc 流中排队,但尚未在您的小部件中使用。
经过一番研究和测试,我得出了这个解决方案。
LoginBloc bloc = LoginBloc();
// We do this instead of entering the text with await tester.enterText
bloc.updateLogin('');
// Build our app and trigger a frame.
await tester.pumpWidget(
BlocProviderList(
child: MaterialApp(
home: LoginScreen(),
),
listBloc: [
Bloc(bloc),
],
),
);
// Trigget another frame so the textfield is updated with the error info
await tester.pump(Duration.zero);
final txtFields = find.byType(TextField);
final finderLogin = txtFields.at(0);
TextField txtFieldLogin = tester.widget(finderLogin);
expect(txtFieldLogin.decoration.errorText, MISSING_DATA); // working alright!