Jasmin SpyOn.and.returnValue()无法使用服务调用

时间:2018-03-13 10:34:06

标签: angular unit-testing observable karma-runner karma-jasmine

在组件中我有一个实际从内部调用服务方法的方法,在该方法中我订阅了服务响应的结果。 但是在测试时我使用了SpyOn.and.returnValue方法,所以现在它没有调用服务方法,但我没有得到响应。它总是调用订阅错误块。

这是我的测试文件代码:

it('should check getMVRData method', inject([WorkflowService, PersonalDataService], (workFlow: WorkflowService, personalDataService: PersonalDataService) => {
    let fixture = TestBed.createComponent(PersonalDataComponent);
    let inst = fixture.componentInstance;
    spyOn(personalDataService, 'getMVRData').and.returnValue(Observable.of(WORKFLOW_DATA));
    inst.getMVRData();

    // After sometime I am checking my console
    setTimeout(() => {
        console.log(inst.value);
        console.log(personalDataService.value)

    }, 1001);
}));

这是我的组件代码:

// Get License Data
value = 'subscribe data'
getMVRData() {
    this.value = 'inside get mvr method';
    this._personalDataService.getMVRData().subscribe(response => {
        let data = JSON.parse(response._body);
        this.value = 'inside success';
    }, error => {
        // This block is calling always
        this.value = 'inside error'
    });
}

这是我的服务文件方法:

value: any;
getMVRData(): Observable < any > {
    this.value = 'inside service';
    let action = this.mvrConfig['action'];
    return this._authHttp.get(AppConfig.API_ENDPOINT() + action + '/?t=' + new Date(), this.headerOptions)
        .map(this._extractData)
        .map(this._doAction)
        .catch(this._handleError);
}

服务文件方法没有接到电话,这工作正常。但returnValue spyOn功能无效。

先谢谢。

1 个答案:

答案 0 :(得分:-2)

您必须调用此处返回的Observable的 subscribe 方法:

spyOn(personalDataService, 'getMVRData').and.returnValue(Observable.of(WORKFLOW_DATA));

your.testfile.ts (并检查您感兴趣的任何值)

it('should check getMVRData method', inject([WorkflowService, PersonalDataService], (workFlow: WorkflowService, personalDataService: PersonalDataService) => {
    let fixture = TestBed.createComponent(PersonalDataComponent);
    let inst = fixture.componentInstance;
    spyOn(personalDataService, 'getMVRData').and.returnValue(Observable.of(WORKFLOW_DATA));

    inst.getMVRData().subscribe(value => {
      console.log(value);
      expect(value).toEqual('It matchs');
    });        
}));