Испытание мрамора RxJs: Журнал ошибок утверждения трудно понять

У меня есть этот код тестирования Rxjs. Это намеренно провалилось, потому что я хочу показать вам журнал ошибок. Что мне было трудно понять, или, по крайней мере, я не могу читать это бегло.

Кто-то может объяснить мне, что означает: $[i].frame = i' to equals i''?

import { delay } from 'rxjs/operators';
import { TestScheduler } from 'rxjs/testing';

describe('Rxjs Testing', () => {

  let s: TestScheduler;

  beforeEach(() => {
    s = new TestScheduler((actual, expected) => {
      expect(actual).toEqual(expected);
    });
  });

  it('should not work', () => {
    s.run(m => {
      const source = s.createColdObservable('-x-y-z|');
      const expected = '-x-y-z|'; // correct expected value is '---x-y-z|'

      const destination = source.pipe(delay(2));
      m.expectObservable(destination).toBe(expected);
    });
  });
});

ht tps://stackru.com/images/9b368b5fa57df399ef0541b8359b6caa988bbab1.png

0 ответов

Чтобы помочь вам лучше понять, что происходит с выводом, давайте сначала попробуем следовать инструкциям из консоли. Существует ссылка, которая указывает, где произошла ошибка. Это на 10-й строке кода, которая является этой строкой:

expect(actual).toEqual(expected);

Установка точки останова на эту строку и запуск теста в режиме отладки показывает actual а также expected объекты.

actual Значения (представлены в формате JSON):

[
  {
    "frame": 3,
    "notification": {"kind": "N", "value": "x", "hasValue": true}
  },
  {
    "frame": 5,
    "notification": {"kind": "N", "value": "y", "hasValue": true}
  },
  {
    "frame": 7,
    "notification": {"kind": "N", "value": "z", "hasValue": true}
  },
  {
    "frame": 8,
    "notification": {"kind": "C", "hasValue": false}
  }
]

И expected:

[
  {
    "frame": 1,
    "notification": {"kind": "N", "value": "x", "hasValue": true}
  },
  {
    "frame": 3,
    "notification": {"kind": "N", "value": "y", "hasValue": true}
  },
  {
    "frame": 5,
    "notification": {"kind": "N", "value": "z", "hasValue": true}
  },
  {
    "frame": 6,
    "notification": {"kind": "C", "hasValue": false}
  }
]

Сравнивая два массива, вы можете увидеть, что frame свойства различны для каждого объекта одного и того же индекса. Этот странный вывод исходит из функции toEqual Жасмина, поэтому давайте попробуем понять ее на основе значений, приведенных выше. Эта строка из консоли

Expected $[0].frame = 3 to equal 1.

означает, что ожидаемое значение 1 не 1, а фактически 3. Эта часть $[0].frame = 3 предполагает реальное значение, и это to equal 1 это то, что вы, как разработчик, думаете, что должно быть. Т.е. expected[0].frame (который равен 1) не равен actual[0].frame (что 3). И так далее, expected[1].frame не равно actual[1].frame...

Теперь вы можете задаться вопросом, почему вы даже получаете такие значения для actual а также expected, Это объясняется гораздо более подробно на официальных документах. Когда вы создаете холод, наблюдаемый с этой мраморной диаграммой -x-y-z| а также delay это с 2 единиц становится ---x-y-z| который затем превращается в нечто сопоставимое - actual массив. Первые три - знаки обозначают три пустых неизлучающих рамки. Они находятся в позициях 0, 1 и 2. Они не имеют представлений ни в одном из двух массивов.

Затем приходит первое реальное значение x, Он представлен как первый объект в actual массив (actual[0]). x находится в положении 3, таким образом, frame свойство имеет то же значение. notification свойство имеет некоторые метаданные, такие как value испускаемого предмета. Вы можете заключить значения для y а также z так же.

Примечание: при использовании run() метод, кадры становятся значениями 1, 2, 3 и т. д. вместо 10, 20, 30, когда не используются run()по наследственным причинам.

Другие вопросы по тегам