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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 10:18:19