0

オブザーバブルを入力として取り、新しいオブザーバブルに切り替えるメソッドがあります。または、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, "notification": {"error": undefined, "hasValue": true, > "kind": "N", "value": "B"}}]

受信: [{"frame": 0, "notification": {"error": undefined, "hasValue": true, > "kind": "N", "value": "B"}}, {"frame" : 0, "通知": {"エラー": > 未定義, "hasValue": false, "種類": "C", "値": 未定義}}]

4

1 に答える 1

0

オペレーターの公式ドキュメントに基づく:first

引数なしで呼び出された場合、最初にソース Observable の最初の値を発行してから完了します。

したがって、obオブザーバブルが最初の値を発行すると、ストリームはすぐに完了します。ここで出力したエラー ログから、受信した配列に 2 つのオブジェクトが含まれていることがわかります。それらは両方とも同じフレーム ( 0) で放出され、2 番目のnotification.kind値は完全なイベントCであることを意味します。C

したがって、次のようなビー玉を期待する必要があります'(b|)'

気になるのは、出力値が一致しないことです。cold作成した 2 つのオブザーバブルに基づいて、trueオブザーバブルで出力しsourceます。を呼び出すとmapFirstToStr(source)first演算子を経由してから を経由しswitchMapます。アロー関数 inswitchMapは、三項演算子の条件に基づいた値でオブザーバブルを返します。受け取った値はtrueであるため、三項条件は をval ? 'A' : 'B'返します'A'。したがって、expectedobservableの値'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);
于 2019-08-29T21:19:46.813 に答える