2017-11-11 1 views
0

대리석 테스트에서 ngrx/effects를 사용하고 있습니다. 약속을 사용하는 서비스가 있습니다. 내 효과가 서비스를 호출하고 성공 및 오류 상태를 모두 처리하기를 원합니다. 나는 코드이ngrx/effects - 약속 테스트 방법

효과처럼이 : .mergeMap(() => this.service.getThings() .map((things) => new SetThingsAction(things)) .catch((error) => of(new HandleAPIErrorAction(error)) ) ) .catch((error) => of(new HandleAPIErrorAction(error)) );

서비스 : public geThings() { return Observable.fromPromise(this.promiseBasedThing.getTheThings()); }

그런 다음 테스트 : actions = hot("a", { a: new GetThingsAction() }); const response = cold("-#", {}); service.getThings.and.returnValue(response); const expected = cold("-b", { b: new HandleAPIErrorAction("error") }); expect(effects.getThings$).toBeObservable(expected);

실제로

이 모든 작동합니다. 그러나이 효과의 이중 캐치는 분명히 나쁘고 아마도 Observables가 어떻게 작동하는지 이해할 수 없다는 것을 암시합니다. 현실 세계에서는 나중에 잡는 것이 효과적입니다. 테스트에서 첫 번째 효과적입니다.

this에 따르면 약속이 구슬 테스트와 호환되지 않는 것처럼 보입니다. This SO question은 오류 처리에 대한 아이디어를 제공하지만 약속이 있기 때문에 테스트가 불가능 해 보입니다.

어떻게 오류 처리, 약속 및 테스트와 함께 ngrx/효과를 사용할 수 있습니까?

답변

0

추가 연구를 통해 나에게 답변 해 줄 수 있습니다.

https://jsfiddle.net/btroncone/upy6nr6n/

는 기본적으로 나는 getThings 대신의 효과를 캐치 할 필요가 있었다.
getThings() { 
    return Observable.fromPromise(this.promiseBasedThing.getTheThings()) 
     .catch((error) => Observable.of(error)); 
    } 

또한 너무/효과를 ngrx 사용하는 동안 대신 그것을 해결하기 위해 노력하는 간단한 rsjx 예를 들어 이러한 문제를 해결하기 위해 훨씬 쉽게 것을 배웠다. 이것은 여전히 ​​두 가지 catch 문을 가지고 있지만, 테스트 조롱은 현재 실제로 작동하는 방식과 일치합니다.