我有一个问题,在Flutter 的测试部分,我写了一个使用CUBIT的简单计数器应用程序的测试,但当我运行所有测试时,它给了我标题中提到的错误,有人知道为什么吗?

必须指出的是,虽然我逐个运行测试都运行成功,但当我运行所有组时,它在第二次和第三次测试中返回错误...

这些是MU代码

group("Counter Cubit", () {
    CounterCubit counterCubit = CounterCubit();
    setUp(() {
      //counterCubit = CounterCubit();
    });

    tearDown(() {
      counterCubit.close();
    });

    test("The initial state for counterCubit is CounterState(counterValue: 0)",
        () {
      expect(counterCubit.state, CounterState(0, false));
    });

    blocTest(
        "The cubit should emit CounterState(counter: 1, isIncrement: true) while we call 
          counterCubit.increment() ",
        build: () => counterCubit,
        act: (CounterCubit cubit) => cubit.increment(),
        expect: () => [CounterState(1, true)]);

    blocTest(
        "The cubit should emit CounterState(counter: -1, isIncrement: false) while we call 
           counterCubit.decrement() ",
        build: () => counterCubit,
        act: (CounterCubit cubit) => cubit.decrement(),
        expect: () => [CounterState(-1, false)]);
});

我的肘长和境界如下:

class CounterCubit extends Cubit<CounterState> {
  CounterCubit() : super(CounterState(0, false));

  void increment() => emit(CounterState(state.counter + 1, true));

  void decrement() => emit(CounterState(state.counter - 1, false));
}

并声明如下:

class CounterState extends Equatable {
  final int counter;
  final bool isIncremented;
  CounterState(this.counter, this.isIncremented);

  @override
  List<Object?> get props => [counter, isIncremented];
}

推荐答案

bloc_test文档中写道:

blocTest使用给定的description创建一个新的特定于bloc的测试用例.BLOCKTEST将在act执行后处理断言,即该块发出预期状态(按顺序).blocTest还处理确保在判断expect之前不发出额外状态106.

所以基本上当你 run 的时候:

blocTest(
  // ...
  build: () => counterCubit, // Same instance for all tests
  // ...
);

它处理您的块实例(您通过build参数传递的).因此,由于第二个测试使用与第一个测试相同的实例,因此它抛出一个异常,因为实际上它是由最后一个blocTest调用(在前一个测试中)关闭的.

它还回答了为什么逐个运行测试有效,而不是整个组有效.

要修复在运行blocTest时传递新实例的问题(通过同一参数),请执行以下操作:

blocTest(
  // ...
  build: () => CounterCubit(), // Create a new instance
  // ...
);

Flutter相关问答推荐

无法将Flutter 连接到Firebase

我不能通过第5步了解Flutter 翼Firebase教程

无效参数(S):隔离消息中的非法参数:try 旋转图像时对象不可发送

BlocBuilder仅生成一次,并在后续发出时停止重建

怎么才能像这样在摆动着这些曲线呢?

Flutter 数独网格

抖动问题:检测到0个或2个或更多具有相同值的[DropdownMenuItem]

在使用 Android 12+ 的真实 Android 设备上,SingleChildScrollView 中最初位于视口之外的无响应 Web 视图

如果其他Provider 的帐户已存在,如何阻止用户登录?

来自服务器的数据未分配给变量

我在手机上找不到我的 Flutter 应用缓存数据

当我将主题更改为深色然后返回浅色模式时,Getx 会Flutter 更改主题,它不会加载我的自定义主题

状况不佳 - Cubit

Flutter sliver 持久化

扩展磁贴尾随图标在与一个磁贴交互时更新列表中的所有内容.如何只更改展开图块的图标?

Flutter - 异步文件读取异常处理

为什么容器会填满整个空间?

Flutter Web Responsiveness 效率不高

Flutter 评级栏包选中和未选中的容器

Flutter 在滚动期间保持某些元素固定?