ngrx router-store - 测试路由器导航效果
ngrx router-store - testing router navigation effects
我的效果和测试工作如下:
登录重定向效果
@Effect()
public loginSuccess$: Observable<Action> = this.actions$.pipe(
ofType<LoginSuccess>(AuthActionTypes.LoginSuccess),
map( action => action.payload ),
concatMap( (payload: Client) => [
new SecondAction(payload),
]),
tap(() => this.router.navigate(['/somepage']))
);
LoginRedirect效果测试
describe('#loginSuccess$', () => {
it('should trigger SecondAction action and redirect to somepage', () => {
spyOn(effects['router'], 'navigate');
actions = hot('-a-', { a: new LoginSuccess({} as any)});
expected = cold('-b', { b: new SecondAction({} as any)});
expect(effects.loginSuccess$).toBeObservable(expected);
expect(effects['router'].navigate).toHaveBeenCalled();
});
});
测试按预期通过。我正在尝试为 ngrx 路由器存储上发生的操作的 Observable 编写相同的测试。例如,这是我的效果。
清除错误效果
@Effect()
public clearError$: Observable<Action> = this.actions$.pipe(
ofType(ROUTER_NAVIGATION), // <-- not using the conventional
mapTo(new ClearErrorMessage())
);
clearError EffectTest
describe('#clearError$', () => {
it('should trigger ClearErrorMessage action', () => {
spyOn(effects['actions$'], 'pipe').and.returnValue(hot('-a', { a: ROUTER_NAVIGATION }));
expected = cold('-b', { b: new ClearErrorMessage() });
expect(effects.clearError$).toBeObservable(expected);
});
});
但是,这里出现错误:
Expected $.length = 0 to equal 1.
Expected $[0] = undefined to equal Object({ frame: 10, notification: Notification({ kind: 'N', value: ClearErrorMessage({ type: '[Auth] ClearErrorMessage' }), error: undefined, hasValue: true }) }).
任何指点将不胜感激
您还应该像在第一个示例中那样使用 actions
而不是 spyOn(...)
此外 ROUTER_NAVIGATION
只是一个字符串,您必须创建一个动作。
describe('#clearError$', () => {
actions$ = hot('-a---', { a: {type: ROUTER_NAVIGATION} });
expected = cold('-b', { b: new ClearErrorMessage() });
expect(effects.clearError$).toBeObservable(expected);
});
我的效果和测试工作如下:
登录重定向效果
@Effect()
public loginSuccess$: Observable<Action> = this.actions$.pipe(
ofType<LoginSuccess>(AuthActionTypes.LoginSuccess),
map( action => action.payload ),
concatMap( (payload: Client) => [
new SecondAction(payload),
]),
tap(() => this.router.navigate(['/somepage']))
);
LoginRedirect效果测试
describe('#loginSuccess$', () => {
it('should trigger SecondAction action and redirect to somepage', () => {
spyOn(effects['router'], 'navigate');
actions = hot('-a-', { a: new LoginSuccess({} as any)});
expected = cold('-b', { b: new SecondAction({} as any)});
expect(effects.loginSuccess$).toBeObservable(expected);
expect(effects['router'].navigate).toHaveBeenCalled();
});
});
测试按预期通过。我正在尝试为 ngrx 路由器存储上发生的操作的 Observable 编写相同的测试。例如,这是我的效果。
清除错误效果
@Effect()
public clearError$: Observable<Action> = this.actions$.pipe(
ofType(ROUTER_NAVIGATION), // <-- not using the conventional
mapTo(new ClearErrorMessage())
);
clearError EffectTest
describe('#clearError$', () => {
it('should trigger ClearErrorMessage action', () => {
spyOn(effects['actions$'], 'pipe').and.returnValue(hot('-a', { a: ROUTER_NAVIGATION }));
expected = cold('-b', { b: new ClearErrorMessage() });
expect(effects.clearError$).toBeObservable(expected);
});
});
但是,这里出现错误:
Expected $.length = 0 to equal 1.
Expected $[0] = undefined to equal Object({ frame: 10, notification: Notification({ kind: 'N', value: ClearErrorMessage({ type: '[Auth] ClearErrorMessage' }), error: undefined, hasValue: true }) }).
任何指点将不胜感激
您还应该像在第一个示例中那样使用 actions
而不是 spyOn(...)
此外 ROUTER_NAVIGATION
只是一个字符串,您必须创建一个动作。
describe('#clearError$', () => {
actions$ = hot('-a---', { a: {type: ROUTER_NAVIGATION} });
expected = cold('-b', { b: new ClearErrorMessage() });
expect(effects.clearError$).toBeObservable(expected);
});