从我的组件单元测试测试服务调用

phy*_*boy 4 testing unit-testing karma-jasmine angular

我如何简单地测试我的服务是否被调用?

myComp.ts

constructor(private myService: MyService) {}

myFunction() {
   this.myService.someFunction();
}
Run Code Online (Sandbox Code Playgroud)

myTest.ts

beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [ReactiveFormsModule, FormsModule, HttpClientModule],
      declarations: [MyComponent]
    })
    .compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(MyComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should delete customer feed', () => {
    const mySpy = spyOn(MyService, 'someFunction');

    component.myFunction();

    expect(mySpy).toHaveBeenCalledTimes(1);
  });
Run Code Online (Sandbox Code Playgroud)

目前,该行const mySpy = spyOn(MyService, 'someFunction');显示红色波浪线,'someFunction'表示:

“someFunction”类型的参数不可分配给原型类型的参数 | 服务 | 网址

根据评论更新 我的设置现在如何:

let myService: MyService;

beforeEach(() => {
  ...
  providers: [MyService],
  ...
  .compileComponents()
});

beforeEach(() => {
  fixture = TesBed.createComponent(MyComponent);
  component = fixture.componentInstance;
  fixture.detectChanges();

  myService = TestBed.get(MyService);
});
Run Code Online (Sandbox Code Playgroud)

更新(解决方案) 我仍然在我的间谍定义中使用大写 MyService 而不是小写 myService!

nir*_*aft 5

您可以简单地继续spyOn您的服务方法以查看它是否被调用。您应该模拟该服务并将其提供给 TestBedConfiguration 中的组件。

您可以模拟所有服务方法并根据需要返回任何值,以检查是否调用了您的服务方法。

 class MyServiceStub {
     constructor(){}

     myFunction() { returns Observable.of({});}

    }
 let myService;
    beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [ReactiveFormsModule, FormsModule, HttpClientModule],
       providers: [
                { provide: MyService, useValue: new MyServiceStub() }
            ],
            schemas: [NO_ERRORS_SCHEMA]
      declarations: [MyComponent]
    })
    .compileComponents();
  }));

   beforeEach(() => {
     fixture = TestBed.createComponent(MyComponent);
     component = fixture.componentInstance;
       fixture.detectChanges();
    myService = TestBed.get(MyService);
    });

  it('should delete customer feed', () => {
    const mySpy = spyOn(myService , 'someFunction');

    component.myFunction();

    expect(mySpy).toHaveBeenCalledTimes(1);
   });
Run Code Online (Sandbox Code Playgroud)

如果您不想使用存根来模拟您的服务,只需TestBed.get(MyService)在向组件提供服务后使用它来获取服务实例TestBed.configureTestingModule