我有一个函数,实际上是一个名为HouseService的Typescript类中的方法,看起来像这样
myHouse() {
return this.bricks$
.pipe(
map(bricks => this.buildHouse(bricks)),
);
}
该方法侦听一个Observable,
this.brick$
,并在通知某些积木后立即使用`this.buildHouse(bricks:Array)方法建造房屋。然后,我编写一个测试,以检查
this.buildHouse
方法仅被调用一次。测试看起来像这样,可以完美运行 it('"buildHouse()" method is called only once for one event of "bricks$"', () => {
spyOn(houseService, 'buildHouse').and.callThrough();
houseService.bricks$.next(newBricks);
expect(houseService.buildHouse).toHaveBeenCalledTimes(1);
});
到目前为止,一切正常。
现在的问题。我更改了myHouse方法的实现,摆脱了胖箭头功能,并用纯方法引用代替了它,如下所示
myHouse() {
return this.bricks$
.pipe(
map(this.buildHouse),
);
}
运行时继续正常运行,但是由于该测试报告
buildHouse
已被调用0次,因此该测试不再起作用。有人可以解释为什么吗? 最佳答案
因为您的myHouse
函数是在模拟该函数之前执行的。因此,原始(未模拟)功能将传递给map
。
使用箭头功能,它会在每次地图调用其回调时执行-当时buildHouse
已被模拟。