首页 > 解决方案 > 本身具有依赖关系的间谍服务

问题描述

我似乎找不到以下问题的示例。我对我的 NGXS 状态进行了单元测试:

describe('Project store', () => {
    let store: Store;
    let projectService: ProjectService;

    beforeEach(async(() => {
        TestBed.configureTestingModule({
            imports: [NgxsModule.forRoot([ProjectState])]
        }).compileComponents();

        projectService = new ProjectService(); // error: needs httpClient

        store = TestBed.get(Store);
    }));

    it('should load projects', () => {

        const EXPECTED_PROJECTS = [
            {
                "id": "1",
                "description": "abc"
            },
            {
                "id": "1",
                "description": "abc"
            }
        ] as Project[];

        spyOn(projectService, 'loadProjects').and.returnValue(EXPECTED_PROJECTS);
        const expected: ProjectStateModel = {
            loadedProjects: EXPECTED_PROJECTS,
            createdProjects: []
        };
        store.dispatch(new LoadProjects());
        const actual = store.selectSnapshot(ProjectState.getState);
        expect(actual).toEqual(expected);
    });

});

ProjectService当它本身需要时,我如何监视它httpClient

我找到了有关如何测试需要的服务的示例httpClient,但现在有关如何模拟需要客户端的服务的示例。

现在我知道我可以自己编写一个模拟服务,但我正在尝试找出是否可以使用 jasmine 间谍来完成。

标签: javascriptangularjasminengxs

解决方案


您可以使用HttpTestingController它来模拟来自您的服务的所需响应,请参见下面的代码:

describe('Project store', () => {
  let store: Store;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [
        HttpClientTestingModule,
        NgxsModule.forRoot([ProjectState])
      ],
      providers: [ProjectService]
    }).compileComponents();

    store = TestBed.get(Store);
  }));

  it('should load projects',
    inject([HttpTestingController], (controller: HttpTestingController) => {
      const EXPECTED_PROJECTS = [
        { 'id': '1', 'description': 'abc' },
        { 'id': '1', 'description': 'abc' }
      ] as Project[];
      const expected = {
        'projectsState': <ProjectStateModel>{
          loadedProjects: EXPECTED_PROJECTS,
          createdProjects: []
        }
      };
      store.dispatch(new LoadProjects());
      // expecting one GET request as a result of LoadProjects action
      const testReq = controller.expectOne(req => req.method === 'GET');
      // provide mock response
      testReq.flush(EXPECTED_PROJECTS);

      const actual = store.selectSnapshot(ProjectState.getState);
      expect(actual).toEqual(expected);
    }));
});

推荐阅读