使用Mocktail和Cubits进行Widget测试时出现Null类型不匹配错误
报错原因
这个错误的核心原因是你仅对BulkUploadCubit的state属性做了mock stub,没有覆盖它的stream属性。不管是context.select还是BlocSelector,都会自动监听cubit的状态流来响应状态变更,mock对象未被stub的方法/属性默认返回null,和预期的Stream<BulkUploadState>类型不匹配就触发了类型错误。
解决方案
你只需要在测试用例的stub逻辑中补充对stream属性的mock即可,你当前的测试仅校验初始态的组件渲染,直接返回空流即可:
testWidgets( "BulkSearchInput", (tester) async { when(() => mockCubit.state).thenReturn(BulkUploadState.initial()); // 新增这行stub stream属性 when(() => mockCubit.stream).thenReturn(const Stream.empty()); await tester.pumpWidget( BlocProvider<BulkUploadCubit>.value( value: mockCubit, child: const MaterialApp(home: BulkSearchInput()), ), ); await tester.pumpAndSettle(); expect(find.byType(TextFormField), findsOneWidget); }, );
如果你后续需要测试状态变更后的组件表现,可以将返回的流替换为Stream.fromIterable([BulkUploadState.initial(), 你要触发的目标状态])来模拟状态更新的场景。
内容的提问来源于stack exchange,提问作者RemeJuan
相关产品推荐
相关产品推荐

