RxJs - тестирование мрамора с потерями на молнии
После этого поста я решил написать мраморный тест для этого оператора.
Вот основной тест:
it('Test lossy zip', () => {
const a = hot('a---a--------a-');
const b = hot('--b----b---b---');
const observable = zip(
a.pipe(take(1)),
b.pipe(take(1))
).pipe(
mergeMapTo(from(['1'])),
repeat()
);
const expected = cold('--1----1-----1-');
expect(observable).toBeObservable(expected);
});
Этот тест проходит, как и ожидалось. Однако, когда я решил запустить два выброса, вот так:
const a = hot('a---a--------a-');
const b = hot('--b----b---b---');
const observable = zip(
a.pipe(take(1)),
b.pipe(take(1))
).pipe(
mergeMapTo(from(['1', '2'])), //Here, emitting two items instead of one
repeat()
);
Я ожидаю, что результирующая наблюдаемая будет выглядеть так:
const expected = cold('--(12)----(12)-----(12)-');
Или, по крайней мере, так:
const expected = cold('--12---12----12-');
Однако оба они терпят неудачу.
Это ошибка в jasmine-marbles
или мои ожидания неверны?
1 ответ
Решение
По всей видимости, согласно официальной документации (которую я недостаточно внимательно прочитал), круглые скобки, а также содержание группы занимают соответствующее количество кадров:
'--(abc)-|'
: на кадре 20 испускатьa
,b
, а такжеc
затем на 80 кадреcomplete
А это значит, что рабочий тест для групповой эмиссии будет выглядеть так:
it('Should emit a grouped value', () => {
const a = hot('a------a---------a---');
const b = hot('--b-------b----b-----');
const observable = zip(
a.pipe(take(1)),
b.pipe(take(1))
).pipe(
mergeMapTo(from(['1', '2'])),
repeat()
);
const expected = cold('--(12)----(12)---(12)');
expect(observable).toBeObservable(expected);
});