我正在尝试弄清楚如何测试服务,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);
});
});
答案 0 :(得分:1)
我不知道HeroesService
的实现是什么,但是我认为我可以根据测试主体的其余部分做出很好的猜测。
调用getHeroes()
时,您将获得一个可观察对象,该对象将在以后的某个日期通过subscribe
处理程序实现。该“以后的日期”出现在测试的最后一行。
httpTestingController
(大概)跟踪TestBed
内事物发出的所有HTTP请求,但不响应它们。当您使用expectOne
提取请求对象时,便可以像远程服务器一样操作并填充响应。
此测试用于测试req.flush(expectedHeroes)
正确地冲洗通过HeroesService
并从另一侧(subscribe
)冲洗,而无需进行修改。