我目前正在为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
我错过了什么?
我试图监视在效果中调用的服务方法,并期待它被触发,但显然它没有。或者更确切地说,订阅块甚至没有进入。
1条答案
按热度按时间c7rzv4ha1#
我想这是因为
concatLatestFrom
和filter
。我想他们返回一个假值,这会停止流。要解决这个问题,您可以使用初始值设置存储,以便它继续。
查看
done
回调,以便此测试在当前状态下失败。https://jestjs.io/docs/asynchronous#callbacks或者,我更喜欢创建一个带有操作的数组,并将该数组用于我的expect语句,有关示例,请参阅https://timdeschryver.dev/blog/testing-an-ngrx-project#e1aedff7251a2ccd78cb118e42f7f2e2