为什么我的 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!