Flutter BLoC单元测试报错:实际值非Stream或StreamQueue如何解决?
问题根因
你抛出异常的核心原因是参数类型不匹配:emitsInOrder匹配器要求传入待匹配的Stream流对象,但你传入的bloc!.state是当前时刻的单个状态快照值,不是流类型,所以触发了was not a Stream or a StreamQueue的报错。
修复步骤
- 修改测试代码中
expectLater的第一个入参,把bloc!.state替换为bloc!.stream,bloc.stream是bloc输出状态变化的流对象,符合匹配器的参数要求:
test( 'should emit [Error] when the input is invalid', () async { // arrange when(mockInputConverter!.stringToUnsignedInteger(SIGNED_STRINGS)) .thenReturn(Left(InvalidInputFailure())); // assert later final expected = [ NumberTriviaEmpty(), NumberTriviaError(message: INVALID_INPUT_FAILURE_MESSAGE), ]; // 仅修改这一行的入参为bloc!.stream expectLater(bloc!.stream, emitsInOrder(expected)); // act bloc!.add(GetTriviaForConcreteNumber(tNumberString)); }, );
- 如果修改后仍出现状态不匹配的报错,说明你使用的
flutter_bloc版本为v7.0及以上:该版本开始bloc的stream默认不会推送初始状态,只有后续变化的新状态才会从流输出,你需要把预期列表中的初始状态NumberTriviaEmpty()删除即可。
额外注意事项
- 单测执行完成后要调用
bloc.close()手动释放资源,避免多个测试用例之间状态互相干扰 - 更推荐使用官方配套的
bloc_test库编写bloc单元测试,内置了状态匹配、生命周期管理的封装,不需要手动处理流监听逻辑。
内容的提问来源于stack exchange,提问作者Muhammad Adnan
相关产品推荐
相关产品推荐

