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
相关产品推荐
相关产品推荐

