Тест наблюдаемого картирования с использованием мрамора - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть метод, который принимает наблюдаемое в качестве входа и переключается на новое наблюдаемое.В качестве альтернативы, я мог бы использовать карту вместо 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," messages ": {" error ":> undefined," hasValue ": false," kind ":" C "," value ": undefined}}]

1 Ответ

0 голосов
/ 30 августа 2019

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

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

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

Итак, вы должныожидаемые шарики, как это: '(b|)'.

Единственное, что меня беспокоит, это то, что выходные значения не совпадают.Основываясь на двух cold наблюдаемых вами, вы излучаете true в source наблюдаемой.Когда вы звоните mapFirstToStr(source), он поступает через оператора first, а затем через switchMap.Функция стрелки в switchMap возвращает наблюдаемое со значением, основанным на условии в троичном операторе.Поскольку полученное значение равно true, троичное условие val ? 'A' : 'B' возвращает 'A'.Таким образом, значение в expected observable может быть не '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);
...