Тест наблюдаемого картирования с использованием мрамора

У меня есть метод, который принимает наблюдаемые в качестве входных данных и переключается на новые наблюдаемые. В качестве альтернативы, я мог бы использовать карту вместо switchMap. Как это можно проверить с помощью мрамора?

mapFirstToStr(ob: Observable<boolean>): Observable<string> {
   return ob.pipe(
       first(),
       switchMap(val => of(val ? 'A' : 'B'))
   );
}

Это не работает:

const source = cold('a', { a: true });
const expected = cold('b', { b: 'B' });
expect(mapFirstToStr(source)).toBeObservable(expected);

Я получаю следующую ошибку:

Ожидаемое значение равно: [{"frame": 0, "messages": {"error": undefined, "hasValue": true, > "kind": "N", "value": "B"}}]

Получено: [{"frame": 0, "messages": {"error": undefined, "hasValue": true, > "kind": "N", "value": "B"}}, {"frame": 0, "уведомление": {"ошибка": > не определено, "hasValue": ложно, "вид": "С", "значение": не определено}}]

0 ответов

На основе официальных документов дляfirst оператор:

Если вызывается без аргументов, сначала выдает первое значение исходного Observable, а затем завершается.

Итак, когда ваш obнаблюдаемый испускает первое значение, поток немедленно завершается. Из журнала ошибок, который вы здесь напечатали, вы можете увидеть, что полученный массив содержит два объекта. Они оба излучаются в одном кадре (0), а второй - notification.kind ценность C что означает, что это Cзавершенное событие.

Итак, вы должны были ожидать таких шариков: '(b|)'.

Единственное, что меня беспокоит, это то, что выходные значения не совпадают. На основе двухcold наблюдаемые, которые вы создали, вы испускаете true в sourceнаблюдаемый. Когда ты звонишьmapFirstToStr(source), это проходит first оператор, а затем через switchMap. Функция стрелки вswitchMapвозвращает наблюдаемый со значением, основанным на условии в тернарном операторе. Поскольку полученное значениеtrue, тернарное условие val ? 'A' : 'B' возвращается 'A'. Таким образом, значение вexpected наблюдаемый не может быть 'B' (это значение из журналов ошибок), но 'A'.

Итак, либо вы испускаете первое значение false:

const source = cold('a', { a: false });
const expected = cold('(b|)', { b: 'B' });
expect(mapFirstToStr(source)).toBeObservable(expected);

Или вы ожидаете 'A':

const source = cold('a', { a: true });
const expected = cold('(b|)', { b: 'A' });
expect(mapFirstToStr(source)).toBeObservable(expected);
Другие вопросы по тегам