Angular 4单元测试服务调用http服务

时间:2018-02-05 11:43:15

标签: angular unit-testing

我有一个调用http函数的服务:

processLogin(info) {
    return this._call.post('login', info).subscribe(response => {
        if (response.status === 'success') {
            this._auth.login(response.object);
            return true;
        }

        return false;
    }, error => {
        return false;
    });
}

这是我试图制作的测试:

describe('Facebook Login', () => {
    let service: FacebookLoginService;
    let call: CallService;

    beforeEach(() => {
        TestBed.configureTestingModule({
            providers: [
                FacebookLoginService,
                { provide: CallService, useClass: CallServiceMock },
            ]
        });

        service = TestBed.get(FacebookLoginService);
        call = TestBed.get(CallService);
    });

    it('should process the login when the post method return success', () => {
        spyOn(call, 'post').and.returnValue(Observable.of({status: 'success'}));

        service.processLogin('any').subscribe(response => {
            console.log(response);
        });
    });
});

但是,当我运行测试时,我不断收到错误消息

  

processLogin()。subscribe(...)不是函数

如果我更改了除Observable.of之外的任何模拟的响应类型,我会收到错误消息

  

call.post.subscribe(...)不是函数

为什么不是wokirng?我对另一项服务进行了非常类似的测试,该服务也调用call.post()并且它正在运行。

1 个答案:

答案 0 :(得分:1)

processLogin不返回可观察但订阅,因此不会有subscribe方法。 subscribe回调中的返回值将被忽略,因此processLogin将无法按预期工作。

可能应该更改为返回一个observable:

return this._call.post('login', info).map(response => { ... });

然后可以测试如下:

spyOn(_call, 'post').and.returnValue(Observable.of({ status: 'success' }));

const login$ = service.processLogin('any');
expect(_call).toHaveBeenCalledWith('login', 'any');

login$.subscribe(response => {
  expect(response).toBe(...);
}, err => { throw err });

还需要模拟_auth