未通过 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);