Flutter Cubit测试报错:bloc_test: Bad state: Cannot emit new states after calling close
解决Cubit测试中"Cannot emit new states after calling close"错误
问题原因
你当前的测试代码存在核心问题:所有测试共用同一个CounterCubit实例。第一个测试执行完成后,tearDown会关闭这个Cubit,后续测试再调用这个已关闭的Cubit方法时,就会触发"无法在关闭后发送新状态"的错误。
修复方案
把CounterCubit的初始化逻辑移到setUp方法中,让每个测试都拥有独立的Cubit实例,确保每次测试都从全新的初始状态开始,测试结束后再关闭当前实例。
修改后的测试代码
group("Counter Cubit", () { late CounterCubit counterCubit; // 仅声明变量,不提前初始化 setUp(() { counterCubit = CounterCubit(); // 每个测试前创建全新实例 }); tearDown(() { counterCubit.close(); // 每个测试结束后关闭当前实例 }); test("初始状态为CounterState(counterValue: 0)", () { expect(counterCubit.state, CounterState(0, false)); }); blocTest( "调用counterCubit.increment()时,应发出CounterState(counter: 1, isIncrement: true)", build: () => counterCubit, act: (CounterCubit cubit) => cubit.increment(), expect: () => [CounterState(1, true)] ); blocTest( "调用counterCubit.decrement()时,应发出CounterState(counter: -1, isIncrement: false)", build: () => counterCubit, act: (CounterCubit cubit) => cubit.decrement(), expect: () => [CounterState(-1, false)] ); });
简化写法(可选)
bloc_test本身可以自动管理Cubit的生命周期,你也可以直接在build参数里创建新实例,省去setUp和tearDown的代码:
group("Counter Cubit", () { test("初始状态为CounterState(counterValue: 0)", () { final cubit = CounterCubit(); expect(cubit.state, CounterState(0, false)); cubit.close(); }); blocTest( "调用counterCubit.increment()时,应发出CounterState(counter: 1, isIncrement: true)", build: () => CounterCubit(), // 直接创建新实例 act: (CounterCubit cubit) => cubit.increment(), expect: () => [CounterState(1, true)] ); blocTest( "调用counterCubit.decrement()时,应发出CounterState(counter: -1, isIncrement: false)", build: () => CounterCubit(), // 直接创建新实例 act: (CounterCubit cubit) => cubit.decrement(), expect: () => [CounterState(-1, false)] ); });
内容的提问来源于stack exchange,提问作者Jafar ashrafi
相关产品推荐
相关产品推荐

