У меня есть служба (ChildService), которая зависит от другой службы (InteractWithServerService). Последний сервис (InteractWithServerService) используется для выполнения серверных вызовов и возврата наблюдаемого типа "любой". Для простоты предположим, что он возвращает наблюдаемую. Я пытаюсь написать unit тест для ChildService.
ChildService
@Injectable()
export class ApplicationService {
constructor(private interactWithServerService:InteractWithServerService){;}
public GetMeData():string {
var output:string;
this.interactWithServerService.get("api/getSomeData").
subscribe(response =>{console.log("server response:", response);
output=response});
return output;
}
}
ServerInteractionService
@Injectable()
export class InteractWithServerService {
constructor(private http: Http) {
;
}
get(url: string): Observable<any> {
return this.http.get(this.url);
}
}
Тестовый пример работает нормально, когда я издеваюсь над зависимой службой. т.е.
class MockInteractWithServerService {
get() {
return Observable.of("some text");
}
}
describe('Service:ChildService', () => {
let childService: ChildService;
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
{ provide: InteractWithServerService, useClass: MockInteractWithServerService },
ChildService],
});
beforeEach(inject([ChildService], (actualService: ChildService) => {
childService= actualService;
}));
fit('should call server-call testCall()', () => {
let actualReturnvalue= childService.GetMeData();
expect(actualReturnvalue).toBe("some text");
});
});
Приведенный выше метод не является предпочтительным, так как я мог бы в итоге написать "n" фиктивных классов для "n" зависимостей. Поэтому я хочу создать свои модульные тесты, используя spyOn. Тем не менее, контрольный пример не работает и выдает "Ошибка: Нет поставщика для Http!". Хотя я понимаю, что это за ошибка, я хотел бы знать, почему она появляется, хотя я шпионю за зависимым сервисом. Похоже, "SpyOn" не работает.
describe('Service:ChildService', () => {
let childService: ChildService;
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
InteractWithServerService,
ChildService],
});
spyOn(InteractWithServerService.prototype, 'get').and
.callFake(()=>
{return Observable.of("some text");});
});
beforeEach(inject([ChildService], (actualService: ChildService) => {
childService= actualService;
}));
fit('should call server-call testCall()', () => {
let actualReturnvalue= childService.GetMeData();
expect(actualReturnvalue).toBe("some text");
});
});
Я что-то упускаю из виду?