Jest.js 为什么不调用expect语句?

owfi6suc  于 2023-11-15  发布在  Jest
关注(0)|答案(1)|浏览(170)

我目前正在为NgRx效果编写单元测试。
这是我的效果:

navigateToProjectOnInvokeJoinProject$ = createEffect(
    () =>
      this.actions$.pipe(
        ofType(invokeJoinProjectSuccess),
        // On reload, projectId is already available. In that case, don't navigate again
        concatLatestFrom(() => this.store.select(selectProjectIdFromRoute)),
        filter(([_, projectId]) => !projectId),
        map(([action, _]) => this.projectDetailsService.initialNavigateToProject(action.projectId))
      ),
    { dispatch: false }
  );

字符串
这是测试:

it("should call initialNavigateToProject if project is not opened yet", () => {
      const action = invokeJoinProjectSuccess({ projectId, activeUsers: [] });

      jest.spyOn(projectDetailsService, "initialNavigateToProject");

      actions$ = of(action);

      effects.navigateToProjectOnInvokeJoinProject$.subscribe(() => {
        expect(projectDetailsService.initialNavigateToProject).toHaveBeenCalledTimes(1);
        expect(projectDetailsService.initialNavigateToProject).toHaveBeenCalledWith(projectId);
      });
    });


它通过了,但只是因为实际上根本没有调用expect语句。我在那里放置expect(1).toEqual(2)以确保测试仍然是绿色,这当然是不可能的。
为了模拟ProjectDetailsService,我使用ng-mocks库的MockProvider,然后使用projectDetailsService = TestBed.inject(ProjectDetailsService);设置TestBed
我错过了什么?
我试图监视在效果中调用的服务方法,并期待它被触发,但显然它没有。或者更确切地说,订阅块甚至没有进入。

c7rzv4ha

c7rzv4ha1#

我想这是因为concatLatestFromfilter。我想他们返回一个假值,这会停止流。
要解决这个问题,您可以使用初始值设置存储,以便它继续。
查看done回调,以便此测试在当前状态下失败。https://jestjs.io/docs/asynchronous#callbacks
或者,我更喜欢创建一个带有操作的数组,并将该数组用于我的expect语句,有关示例,请参阅https://timdeschryver.dev/blog/testing-an-ngrx-project#e1aedff7251a2ccd78cb118e42f7f2e2

相关问题