我正在测试一个依赖于Http服务的角度4服务。 testing guide建议使用隔离的单元测试,其中使用new
关键字创建服务实例:
beforeEach(() => { service = new FancyService(); });
但是当FancyService使用Http服务时,我收到错误
提供的参数与呼叫目标的任何签名都不匹配。
这是有道理的,因为Http服务在FancyService构造函数中。所以我添加了一个新的Http实例,如下所示,但我得到了同样的错误。
beforeEach(() => { service = new FancyService(new Http())})
如何在测试中提供我的服务?
答案 0 :(得分:1)
您需要模拟依赖项 - 使用具有必要方法的存根服务。
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/take';
class FancyService {
constructor(private http: HttpClient) {}
getFancy(): Observable<any> {
return this.http.get('url');
}
}
describe('FancyService', () => {
let service: FancyService;
it('can get fancy', () => {
const fakeHttpClient = {
get: () => {}
};
spyOn(fakeHttpClient, 'get').and.returnValue(Observable.of('data'));
service = new FancyService(<any>fakeHttpClient);
service.getFancy().take(1).subscribe(
(result: any) => {
expect(result).toBe('data');
}
);
expect(fakeHttpClient.get).toHaveBeenCalledTimes(1);
expect(fakeHttpClient.get).toHaveBeenCalledWith('url');
});
});