角服务测试-期望值如何返回?

时间:2019-01-09 19:03:19

标签: angular unit-testing

我正在尝试弄清楚如何测试服务,docs引用了StackBlitz example

在断言通过的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 :(得分:1)

我不知道HeroesService的实现是什么,但是我认为我可以根据测试主体的其余部分做出很好的猜测。

调用getHeroes()时,您将获得一个可观察对象,该对象将在以后的某个日期通过subscribe处理程序实现。该“以后的日期”出现在测试的最后一行。

httpTestingController(大概)跟踪TestBed内事物发出的所有HTTP请求,但不响应它们。当您使用expectOne提取请求对象时,便可以像远程服务器一样操作并填充响应。

此测试用于测试req.flush(expectedHeroes)正确地冲洗通过HeroesService并从另一侧(subscribe)冲洗,而无需进行修改。