使用Karma测试方法中的服务是否已更新

时间:2019-04-08 14:07:22

标签: angular karma-jasmine

我想测试组件中具有的服务在调用方法后是否更新了他的属性。我怎样才能做到这一点?

//.ts
public makeSomething(obj:MyObj) {
     //set attribute on my service 
     this.myService.setAtt(true);
}


.spec.ts
  it('should set attrib true on my service ',async(() => {

      let myObj: MyObj;
      component.makeSomething(myObj);
      //should check here if my service has att true!!!!!
      //how??     
 }));

2 个答案:

答案 0 :(得分:1)

我建议您在呼叫后使用spyOn(...)toHaveBeenCalled()方法来检查更新后的值。

Here's an example关于如何使用它。

因此,在您的spec文件中,它看起来像:

  it('should set attrib true on my service ',async(() => {

      let myObj: MyObj;
      spyOn(myService, 'myServiceMethod');
      component.makeSomething(myObj);

      expect(myService.myServiceMethod).toHaveBeenCalled();
      // other checks here...
   }));

请不要忘记在您的it语句中导入服务。

答案 1 :(得分:1)

您不应该测试服务是否已更新。您应该测试的是您的服务方法已被调用。

您将在服务测试中测试您的服务已更新。

这就是单元测试应该做的:测试一个单元。

如果您测试服务已更新,则每次更改服务时都必须更新测试。现在想象一下该服务被400个组件使用,您将怎么办?编辑所有组件?

只需测试该函数已被调用:

const spy = spyOn(component.myService, 'setAttr');
component.makeSomething(myObj);
expect(spy).toHaveBeenCalledWith(true);
expect(spy).toHaveBeenCalledTimes(1);