spyOn服务/组件Angular2

时间:2018-01-09 17:48:40

标签: angular unit-testing testing karma-jasmine

我正在尝试使用服务实现单元测试。我想澄清为什么这不起作用。

我的spec类的setUp。

beforeEach(() => {
    fixture = TestBed.createComponent(testComp);
    service = fixture.debugElement.injector.get(TestService);
});

 it('mockService', () => {
    spyOn(service, "testFuncCall");
    let buttonClick = fixture.debugElement.query(By.css('.testFuncCall'));
    buttonClick.triggerEventHandler('click', null);
    expect(service.testFuncCall).toHaveBeenCalled();
  })

所以上面运行正常,如果我点击按钮 - 点击其他按钮就会失败。 我试图做的是

 it('mockService', () => {
    spyOn(service, "testFuncCall");
    spyOn(component, "testFuncCall");
    let buttonClick = fixture.debugElement.query(By.css('.testFuncCall'));
    buttonClick.triggerEventHandler('click', null);
    expect(component.testFuncCall).toHaveBeenCalled();
    expect(service.testFuncCall).toHaveBeenCalled();
  })

这会抛出一个错误,说已经调用了Expected spy testFuncCall。只是想知道为什么会这样。该组件有一个名为testFuncCall的方法,它启动按钮单击。该方法调用具有同名testFuncCall方法的Service。

如果我将它分开,一个用于测试component.testFuncCall是否已被调用,另一个用于调用service.testFuncCall,看起来很好。但将这些组合成一个会引发错误吗?

1 个答案:

答案 0 :(得分:0)

当你监视一个方法时,你基本上用一个不做任何事情的方法替换它(除了记录以后能够验证它们的调用)。因此,假组件功能不再做任何事情,因此不再调用该服务。

您可以使用

使其完成实际操作
spyOn(component, "testFuncCall").and.callThrough();

请参阅the documentation