С классом дротика, который имеет параметр списка типов, как можно сделать его равноправным

Я играю с новой библиотекой bloc_test для флаттера и реализовал следующий тест

blocTest('should return ReservationsLoadSucess when the use case returns a list of reservationsList',

    build: () {
      when(mockGetReservations(any)).thenAnswer((_) async => Right(reservationsList));
      return ReservationBloc(getReservations: mockGetReservations);
    },
    act: (bloc) async {
      bloc.add(ReservationsRequested(user));
    },
    expect: [
      ReservationsInitial(),
      ReservationsLoadInProgress(),
      ReservationsLoadSuccess(reservationsList),
    ],
  );

Это реализация ReservationsLoadSuccess

class ReservationsLoadSuccess extends ReservationState {
  final List<Reservation> list;

  ReservationsLoadSuccess(this.list);

  @override
  List<Object> get props => [list];
}

Если ReservationState расширяет Equatable Now, при запуске теста вы получаете следующую ошибку

should return ReservationsLoadSucess when the use case returns a list of reservationsList:

ERROR: Expected: [
            ReservationsInitial:ReservationsInitial,
            ReservationsLoadInProgress:ReservationsLoadInProgress,
            ReservationsLoadSuccess:ReservationsLoadSuccess
          ]
  Actual: [
            ReservationsInitial:ReservationsInitial,
            ReservationsLoadInProgress:ReservationsLoadInProgress,
            ReservationsLoadSuccess:ReservationsLoadSuccess
          ]
   Which: was ReservationsLoadSuccess:<ReservationsLoadSuccess> instead of ReservationsLoadSuccess:<ReservationsLoadSuccess> at location [2]

В основном говоря, что состояние ReservationsLoadSuccess в позиции 2 в фактическом списке не равно его одноранговому элементу в ожидаемом списке.

Я попытался переопределить оператор == в классе ReservationsLoadSuccess следующим образом

class ReservationsLoadSuccess extends ReservationState {
  final List<Reservation> list;

  ReservationsLoadSuccess(this.list);

  final Function eq = const ListEquality().equals;
  @override
  List<Object> get props => [];

  @override
  bool operator ==(Object other) =>
      identical(this, other) ||
      other is ReservationsLoadSuccess &&
          runtimeType == other.runtimeType &&
          eq(list, other.list);
}

Но это, похоже, не сработало, и запуск теста по-прежнему выдавал ту же ошибку. Единственный способ заставить его работать - оставить метод props, возвращающий пустой список или добавив любую другую фиктивную переменную, и передать его в список props.

Есть ли способ сделать класс равным по параметру списка?


person Hossam Elharmil    schedule 24.12.2019    source источник


Ответы (1)


Вы пытались заглянуть в пакет equatable. Часто используется при применении паттерна BLoC.

person Guillaume Roux    schedule 24.12.2019
comment
Я уже упоминал, что абстрактный класс ReservationState расширяет equatable. Но реализация Equatable не покрывает сценарий, в котором у вас есть итерация в качестве переменной. Equatable в основном выполняет цикл по всем параметрам вашего класса и сравнивает их со своими одноранговыми узлами в другом экземпляре. Теперь, когда вы сравниваете список с другим с теми же элементами, он не возвращает истину, если это не тот же список (ссылочное равенство) - person Hossam Elharmil; 24.12.2019