You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Bloc测试出现意外结果:指定用例不通过问题排查

问题根因

  • 你在测试外层提前初始化了全局的cubit实例,且仅第二个测试用例在build方法中返回了这个全局实例,另外两个测试都是在build中新建的独立cubit实例
  • 每个测试用例执行完成后都会触发tearDown逻辑调用cubit.close(),第一个测试执行完成后全局实例就已经被关闭了,运行第二个测试时拿到的是已关闭的cubit:已关闭的Cubit调用emit方法不会产生任何状态流输出,所以日志显示实际输出为空数组
  • 第三个测试用例是在build中新建的cubit,不受全局实例状态影响,所以可以正常通过

修复方案

修改第二个测试用例的build逻辑,和其他测试保持一致,每次测试都创建全新的cubit实例即可:

blocTest<UserAuthenticationCubit, UserBase>(
  'emits NoUser when repo returns null',
  setUp: () {
    when(() => repo(kFakeUserCredentials)).thenAnswer(
      (_) => Future.sync(() => null),
    );
  },
  // 这里不要返回全局的cubit,每次新建实例
  build: () => UserAuthenticationCubit(repo),
  act: (cubit) => cubit.authenticate(kFakeUserCredentials),
  expect: () => const [MaybeUser(), NoUser()],
);

额外优化建议

bloc_test库会自动管理build方法返回的Cubit/Bloc的生命周期,测试完成后会自动关闭实例,你可以删除外层手动声明的全局cubit和自定义的tearDown逻辑,避免后续再出现类似的实例状态污染问题。

内容的提问来源于stack exchange,提问作者aoatmon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 15:27:00