我有一个函数,实际上是一个名为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已被模拟。

09-25 18:50