を使用する Angular アプリで次の効果を作成しましたrxjs
。MyActions.myAction
で、プロパティ (ID の配列) を含むオブジェクトを受け取り、IDids
ごとに を介して HTTP リクエストを送信しthis.myApiService.getResource
ますObservable<Resource>
。次に、すべての結果を配列に収集し、配列を渡す別のアクションをディスパッチします。
public loadResources$: Observable<MyAction> = this.actions$.pipe(
ofType(MyActions.myAction),
switchMap(({ ids }) => from(ids).pipe(
mergeMap(id => this.myApiService.getResource(id)),
toArray()
)),
map(resources) => MyActions.resourcesLoaded({ resources } )),
);
上記のコードは仕事をしますが、リアクティブ演算子の 2 つのフローをネストすることを避けるべきかどうか、またそれを記述するためのより良い方法があるかどうか疑問に思います。
私が疑問に思う理由は、そのテストを書くのに問題があるからです。以下のテストを書きましたが、合格できません。
it('should dispatch an resourcesLoaded action with the resources', () => {
const ids = ['5f7c723832758b859bd8f866'];
const resources = [{} as Resource];
const values = {
l: MyActions.loadResources({ ids }),
t: ids[0],
o: MyActions.resourcesLoaded({ resources })
};
actions = hot('--l------------', values);
const get$ = cold(' -------t-----', values);
const expected = cold('---------o-----', values);
myApiService.getResource.withArgs(ids[0]).returns(get$);
expect(myEffects.loadResources$).toBeObservable(expected);
});
私が得るエラーは次のとおりです。
Expected $.length = 0 to equal 1.
Expected $[0] = undefined to equal Object({ frame: 50, notification: Notification({ kind: 'N', value: { ....
Error: Expected $.length = 0 to equal 1.
Expected $[0] = undefined to equal Object({ frame: 50, notification: Notification({ kind: 'N', value: { ....
at <Jasmine>
at compare (http://localhost:9876/Users/jacopolanzoni/Documents/Development/myProject/node_modules/jasmine-marbles/index.js:91:1)
at <Jasmine>