Испытание мрамора 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()
по наследственным причинам.