angular:jasmine调用subscribe函数

时间:2017-10-11 12:31:20

标签: angular jasmine

这是ts代码

 handleSave () {
    this.save.showModal();

    this.gridService
        .handleSave(this)
        .subscribe((request) => this.saveProgressModalComponent.progress(request));

  }

这是茉莉花的代码。

class GridServiceMock {
    public dirtySubject : BehaviorSubject<any> = new BehaviorSubject(false);
    public gridCellUpdated                     = false;
    public changeHash : any                    = {};
    handleChange(id, data, row, value) {
    }
    handleSave(gridComponent){

    }
}

 { provide : GridService,useClass : GridServiceMock},

it(
      'should handle save', () => {
        const modalSpy = spyOn(component['saveProgressModalComponent'], 'showModal').and.returnValue(true);
    let result;
    const gridSpy = spyOn(component['gridService'], 'handleSave').and.callFake(function(component) {
          return {
            then: (response) => result = response
          };
        });
        component.handleSave();
        expect(modalSpy).toHaveBeenCalled();
        expect(gridSpy).toHaveBeenCalled();
      }
    );

错误:

Error: <spyOn> : handleSave() method does not exist

1 个答案:

答案 0 :(得分:0)

您的问题是gridService是私有的。您不能(也不应该)访问私有财产。

您需要做的是提供服务并保存实例:

let gridService: GridService;

providers: [
 {
  provide: GridService,
  useValue: {
  handleSave: _ => {}, // or whatever needs to be returned
  },
 },


beforeEach(()=>{
 gridService = fixture.debugElement.injector.get(GridService)
});

现在使用gridService代替component['gridService']