我有一个调用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()
并且它正在运行。
答案 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
。