网站搜索

javascript - 只模拟 Angular 服务的一个方法


我有一个 Angular 服务,其中一个方法监听状态变化并返回一个可观察对象,但同一服务的其他方法执行转换逻辑:

ngOnInit() {
    this.isLoading = true;
    this.myService.stateListener().subscribe((res: any) => {
        this.data = this.myService.transformModel(res);
        this.isLoading = false;
        this.cd.detectChanges();
    }, (err) => {
        this.errMessage = 'Data could not be loaded';
        this.isLoading = false;
    });
}

在测试中,我模拟状态监听器以返回特定的可测试数据,如下所示:

const mockService = jasmine.createSpyObj('myService', ['stateListener']);
mockService.stateListener.and.returnValue(of({
    number: 107,
    mock: someMock
}));

问题是由于我已经模拟了该服务,所以方法 'transformerModel' 在模拟的服务上不再存在,因此绑定到组件的数据是 'undefined'。

有没有办法只模拟返回的可观察对象(stateListener),而不模拟同一服务的转换方法?

答案#1

let testData={}// stubbed response of Observable or Model
let dataStub=fixture.debugElement.injector.get(MyService);
spyOn(dataStub, 'stateListener').and.returnValue(
      Observable.of(testData)
    );

你可以使用 stub 和 returnValue 以及 Observable.of 来模拟它并返回这个可观察对象。