Angular Service Testing - Как возвращается ожидаемое значение? - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь выяснить, как тестировать сервисы, и документы ссылаются на этот пример StackBlitz .

Я не могу понять , как , в тесте it('should return expected heroes (called once)', который проходит утверждение. Я не вижу ложных или шпионских сообщений, настроенных на возврат expectedHeroes при вызове функции getHeroes() в службе, так как же это происходит?

describe('#getHeroes', () => {
    let expectedHeroes: Hero[];

    beforeEach(() => {
      heroService = TestBed.get(HeroesService);
      expectedHeroes = [
        { id: 1, name: 'A' },
        { id: 2, name: 'B' },
       ] as Hero[];
    });

    it('should return expected heroes (called once)', () => {
    //------------------------------------------
    // HOW IS THIS PASSING???

      heroService.getHeroes().subscribe(
        heroes => expect(heroes).toEqual(expectedHeroes, 'should return expected heroes'),
        fail
      );

      // HeroService should have made one request to GET heroes from expected URL
      const req = httpTestingController.expectOne(heroService.heroesUrl);
      expect(req.request.method).toEqual('GET');

      // Respond with the mock heroes
      req.flush(expectedHeroes);
    });
  });

1 Ответ

0 голосов
/ 09 января 2019

Я не знаю, какова реализация HeroesService, но я думаю, что могу сделать довольно хорошее предположение на основе оставшейся части тестового тела.

Когда вы вызываете getHeroes(), вы получаете наблюдаемый объект, который будет выполнен позднее через обработчик subscribe. Эта «более поздняя дата» становится последней строкой вашего теста.

httpTestingController (предположительно) отслеживает все HTTP-запросы, сделанные объектами в пределах TestBed, но не отвечает на них. Когда вы выбираете объект запроса (используя expectOne), вы можете действовать так, как если бы вы были удаленным сервером, и заполнять ответ.

Этот тест проверяет, что req.flush(expectedHeroes) правильно проходит через HeroesService и другую сторону (subscribe) без изменений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...