未通过 ngrx 效果单元测试,其中效果标记为 { dispatch: false } 和效果 returns 操作
Fail ngrx effect unit test where the effect is marked with { dispatch: false } and the effect returns action
考虑以下代码:
loadProducts$ = createEffect(() =>
this.actions$.pipe(
ofType(requestLoadProducts),
switchMap(action =>
this.service.load().pipe(
map(data => loadProducts({products: data}))
))
)
, { dispatch: false });
如您所见,添加 { dispatch: false }
是开发人员犯的一个错误(因为效果应该 return 并发送一个动作),这个错误只能通过手动测试应用程序才能发现,因为试图覆盖此效果的单元测试已通过。
describe('loadProuct$', () => {
it('should return loadProducts', (done) => {
actions$ = of(requestLoadProducts);
effects.loadProducts$.subscribe((result) => {
expect(result).toEqual(
loadProducts({
products: [{ id: 1, name: 'asd', price: '2', image: 2 }],
})
);
done();
});
});
});
我知道 { dispatch: false }
不会改变流程,它只是阻止在后台实际调度 returned 操作。
不幸的是,这意味着这样的错误无法在单元测试中被捕获。
你知道在单元测试中正确覆盖这个的任何解决方案吗?
您可以使用 getEffectsMetadata
来验证调度设置为 false
。
这个方法returns一个效果的配置
import { getEffectsMetadata } from @ngrx/effects;
expect(getEffectsMetadata(effectClass).effectProperty$.dispatch).toBe(false);
考虑以下代码:
loadProducts$ = createEffect(() =>
this.actions$.pipe(
ofType(requestLoadProducts),
switchMap(action =>
this.service.load().pipe(
map(data => loadProducts({products: data}))
))
)
, { dispatch: false });
如您所见,添加 { dispatch: false }
是开发人员犯的一个错误(因为效果应该 return 并发送一个动作),这个错误只能通过手动测试应用程序才能发现,因为试图覆盖此效果的单元测试已通过。
describe('loadProuct$', () => {
it('should return loadProducts', (done) => {
actions$ = of(requestLoadProducts);
effects.loadProducts$.subscribe((result) => {
expect(result).toEqual(
loadProducts({
products: [{ id: 1, name: 'asd', price: '2', image: 2 }],
})
);
done();
});
});
});
我知道 { dispatch: false }
不会改变流程,它只是阻止在后台实际调度 returned 操作。
不幸的是,这意味着这样的错误无法在单元测试中被捕获。
你知道在单元测试中正确覆盖这个的任何解决方案吗?
您可以使用 getEffectsMetadata
来验证调度设置为 false
。
这个方法returns一个效果的配置
import { getEffectsMetadata } from @ngrx/effects;
expect(getEffectsMetadata(effectClass).effectProperty$.dispatch).toBe(false);