шпионская служба, которая сама по себе имеет зависимости - PullRequest
0 голосов
/ 01 декабря 2019

Я не могу найти пример для следующей проблемы. У меня есть модульный тест для моего состояния 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, но теперь о том, как смоделировать службу, которая нуждается в клиенте.

Теперь я знаю, что могу написать сам макет службы, но я пытаюсь выяснить, может ли этобыть сделано с использованием жасминовых шпионов.

1 Ответ

0 голосов
/ 02 декабря 2019

Вы можете использовать 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);
    }));
});
...