Тестовый поток с обернутым массивом - PullRequest
1 голос
/ 19 февраля 2020

Я пытаюсь проверить, что функция emitArray испускает Response.Success, а ее значение равно ['test'].
Если я испускаю List<String>, все работает как положено, но как только я обертываю список результатов в Response<List<String>> тест не пройден.

Результат выдаётся, но не получается при сравнении с ожидаемым результатом.
Мне интересно, связано ли это с реализацией == в Response.Success, я использую реализацию по умолчанию что обеспечивает IDE.

Это не настоящий код, который у меня есть, это просто простой пример, который легче понять, чтобы попытаться определить проблему.

Это мой класс проверить:

class ListResponse {
  final _array = BehaviorSubject<Response<List<String>>>();

  Stream<Response<List<String>>> get array => _array.stream;

  Future<void> emitArray() async {
    _array.add(Response.success(['test']));
  }

  void dispose() {
    _array.close();
  }
}

Это мой тест:

void main() {
  ListResponse underTest;
  setUp(() {
    underTest = ListResponse();
  });

  test('It should emit array', () {
    final array = Response.success(['test']);

    expect(
      underTest.array,
      emitsInOrder([
        array,
        emitsDone,
      ]),
    );

    underTest.emitArray();

    underTest.dispose();
  });
}

Это ошибка, которую выдает:

Expected: should do the following in order:
          • emit an event that SuccessResponse<List<String>>:<SuccessResponse{value: [test]}>
          • be done
  Actual: <Instance of 'BehaviorSubject<Response<List<String>>>'>
   Which: emitted • SuccessResponse{value: [test]}
                  x Stream closed.
            which didn't emit an event that SuccessResponse<List<String>>:<SuccessResponse{value: [test]}>

Это класс ответа

class Response<T> {
  Response._();

  factory Response.success(T value) = SuccessResponse<T>;
  factory Response.error(Exception error) = ErrorResponse<T>;
}

class ErrorResponse<T> extends Response<T> {
  ErrorResponse(this.error): super._();

  final Exception error;

  @override
  bool operator ==(Object other) =>
      identical(this, other) ||
          other is ErrorResponse &&
              runtimeType == other.runtimeType &&
              error == other.error;

  @override
  int get hashCode => error.hashCode;

  @override
  String toString() {
    return 'ErrorResponse{error: $error}';
  }
}

class SuccessResponse<T> extends Response<T> {
  SuccessResponse(this.value): super._();

  final T value;

  @override
  bool operator ==(Object other) =>
      identical(this, other) ||
          other is SuccessResponse &&
              runtimeType == other.runtimeType &&
              value == other.value;

  @override
  int get hashCode => value.hashCode;

  @override
  String toString() {
    return 'SuccessResponse{value: $value}';
  }
}

1 Ответ

1 голос
/ 21 февраля 2020

Мне интересно, связано ли это с реализацией == в Response.Success

Точно. Этот конкретный тест не пройден, потому что вы не можете сравнить списки с ==:

abstract class List<E> implements EfficientLengthIterable<E> {
  ...
  /**
  * Whether this list is equal to [other].
  *
  * Lists are, by default, only equal to themselves.
  * Even if [other] is also a list, the equality comparison
  * does not compare the elements of the two lists.
  */
 bool operator ==(Object other);
}

В качестве обходного пути вы можете вместо этого изменить реализацию для сравнения строковых представлений объектов:

  @override
  bool operator ==(Object other) =>
      identical(this, other) ||
      other is SuccessResponse &&
          runtimeType == other.runtimeType &&
          value.toString() == other.value.toString();


Интересно, что прохождение развернутых объектов List<String> проходит тестирование. Это происходит потому, что StreamMatcher использует equals() из пакета matcher для сопоставления событий, а equals() может сопоставлять списки и карты . Сначала он пытается сопоставить объекты с ==, затем проверяет, являются ли они Iterable / Set / Map (и глубоко совпадает с ними рекурсивно), а затем сообщает об ошибке несоответствия.

...