如何解决测试发出延迟动作或不发出任何内容的 NGRX 效果
我有一个 NGRX 效果 - 根据状态 - 发出延迟的动作或不发出任何动作。 我想编写一个测试,涵盖这两种情况。
效果如下:
myEffect$ = createEffect(() =>
this.actions$.pipe(
ofType(MyAction),filter(state => state.foo === false),delay(4000),map(state => myOtherAction())
)
);
测试它应该发出具有延迟的 otherAction 的情况:
describe('emit my action',() => {
const action = MyAction();
it('should return a stream with myOtherAction',() => {
const scheduler = getTestScheduler();
scheduler.run(helpers => {
// build the observable with the action
actions = hot('-a',{ a: action });
// define what is the expected outcome of the effect
const expected = {
b: MyOtherAction()
};
helpers.expectObservable(effects.myEffect$).toBe('- 4000ms b',expected);
});
});
});
但我不知道如何测试另一个状态,它应该不发出另一个动作(流的长度为零):
it('should return an empty stream',() => {
store.setState({
myFeature: {
foo: true
}
});
// ???
});
请帮忙:)
解决方法
这将很难做到,因为过滤器会阻止效果返回可观察的。
选项 1: // 无论您在何处调度 MyAction,仅当创建的操作的 foo 属性为 true 时才调度它
选项 2: // 改变效果结构返回空
import { EMPTY } from 'rxjs';
....
myEffect$ = createEffect(() =>
this.actions$.pipe(
ofType(MyAction),delay(4000),map(state => state.foo ? myOtherAction() : EMPTY)
)
);
测试:
import { EMPTY } from 'rxjs';
....
describe('emit my action',() => {
const action = MyAction();
action.foo = false; // set foo property to false
it('should return a stream with myOtherAction',() => {
const scheduler = getTestScheduler();
scheduler.run(helpers => {
// build the observable with the action
actions = hot('-a',{ a: action });
// define what is the expected outcome of the effect
const expected = {
b: EMPTY // assert now it is empty
};
helpers.expectObservable(effects.myEffect$).toBe('- 4000ms b',expected);
});
});
})
,
由于 AliF50 的提示,我将链中的 filter
(阻止 Observable 发出)替换为“Noop Action”(= 没有任何侦听器的正常操作)。因此,我没有检查过滤器中的 foo
属性,而是返回映射中的 noopAction
,当 foo 为真时,返回 otherAction 时为假。
效果:
myEffect$ = createEffect(() =>
this.actions$.pipe(
ofType(MyAction),//filter(state => state.foo === false),map(state => state.foo !== false ? noopAction() : myOtherAction())
)
);
测试:
describe('emit my action',() => {
const action = MyAction();
it('should return a stream with myOtherAction',() => {
const scheduler = getTestScheduler();
scheduler.run(helpers => {
// build the observable with the action
actions = hot('-a',{ a: action });
// define what is the expected outcome of the effect
const expected = {
b: MyOtherAction()
};
helpers.expectObservable(effects.myEffect$).toBe('- 4000ms b',expected);
});
});
it('should return a stream with noop action as foo is true',() => {
store.setState({
myFeature: {
foo: true
}
});
const scheduler = getTestScheduler();
scheduler.run(helpers => {
// build the observable with the action
actions = hot('-a',{ a: action });
// define what is the expected outcome of the effect
const expected = {
b: NoopAction()
};
helpers.expectObservable(effects.myEffect$).toBe('- 4000ms b',expected);
});
});
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。