当触发一个效果时,我想在单元测试中测试这两个可观察变量,以获取这部分代码的100%代码覆盖率。因为window.location.href
被触发,所以我无法正确测试它。
export class RouteHelper {
static redirectToExternalUrl(url: string): any {
window.location.href = url;
}
}
效果
@Effect()
handleCreatePaymentSuccess$: Observable<
{} | routerActions.Go
> = this.actions$.pipe(
ofType(cartConfigActions.CREATE_PAYMENT_SUCCESS),
switchMap((action: any) => {
if (action.payload.redirect) {
/* istanbul ignore next */
return Observable.create(
RouteHelper.redirectToExternalUrl(action.payload.redirect),
);
} else {
return of(
new routerActions.Go({
path: [RouteHelper.paths['validate']],
}),
);
}
}),
);
测试是否在else条件下工作
it('should dispatch router action Go on success if no redirect url is provided', () => {
const payload = { redirect: null };
const action = new fromCartConfig.CreatePaymentSuccess(payload);
const completion = new routeractions.Go({
path: [RouteHelper.paths['validate']],
});
actions$.stream = cold('-a', { a: action });
const expected = cold('-c', { c: completion });
expect(effects.handleCreatePaymentSuccess$).toBeObservable(expected);
});
测试不适用于if条件
it('should redirect to url that is returned from api', () => {
const payload = { redirect: 'http://www.stackoverflow.com' };
spyOn(RouteHelper, 'redirectToExternalUrl').withArgs(payload.redirect);
const action = new fromCartConfig.CreatePaymentSuccess(payload);
const completion = Observable.create(RouteHelper.redirectToExternalUrl);
actions$.stream = cold('-a', { a: action });
const expected = cold('-c', { c: completion });
expect(effects.handleCreatePaymentSuccess$).toBeObservable(expected);
});
有人可以解释如何测试If条件吗?
答案 0 :(得分:1)
解决方案:
it('should dispatch router action Go on success if redirect url is provided', () => {
spyOn(RouteHelper, 'redirectToExternalUrl').and.callFake(() => {});
const payload = { redirect: 'www.buckaroo.nl' };
const action = new fromCartConfig.CreatePaymentSuccess(payload);
actions$.stream = cold('-a', { a: action });
const expected = cold('');
expect(effects.handleCreatePaymentSuccess$).toBeObservable(expected);
expect(RouteHelper.redirectToExternalUrl).toHaveBeenCalled();
});
答案 1 :(得分:0)
您可以在测试期间将RouteHelper
注入并提供模拟实现。这样,您可以验证该方法是否已调用。