Методы класса были наблюдаемыми, и тесты работали нормально. Теперь требования изменились, и имело больше смысла давать им обещания, но теперь я не могу настроить юнит-тест. У меня есть этот довольно простой класс с одним методом publi c, который должен быть проверен модулем. Я полагаю, что проблема заключается в моей реализации fakeAsyn c с обещаниями.
По сути, тест «был сделан вызов http или нет?», Который определяется методом на основе параметра, как показано ниже. Мой юнит тест внизу. Но когда я запускаю свои тесты, следующее никогда не выполняется, хотя я и издевался над методом:
vm.settingService.currentSetting()
в моем основном сервисе.
main.service.ts
class MainService(){
constructor(
private settingService: SettingService,
) {}
private addToStorage(): Promise<any> {
localstorage.setItem("item","done")
return Promise.resolve(true)
}
private fetchDataFromAPI(currentSetting): Promise<any> {
let url = "http://www.example.com";
return this.http
.get(url)
.pipe(catchError(this.handleError))
.toPromise();
}
getData(
fromAPI: boolean = false,
): Promise<any> {
/*
get data from API or not
*/
const that: any = this;
return new Promise((resolve, reject) => {
that.settingService.currentSetting().then(
currentSetting => {
if (fromAPI) {
that.fetchDataFromAPI(currentSetting)
.then(data => {
that.addToStorage()
.then(values => {
resolve(values);
})
.catch(err => {
reject(true);
});
})
.catch(err => {
console.log("cant get data from the API");
});
} else {
// get from localStorage
resolve(true)
}
}).catch(error=>{
console.log("We have an error here ", error);
resolve([]);
});
});
}
}
setting.service.ts
import { Injectable } from "@angular/core";
@Injectable()
export class SettingService {
constructor() {}
currentSetting(): Promise<any> {
// gets from a storage. simplicity purpose get from localStorage
let vm = this;
let data = localStorage.getItem("data") || ""
return new Promise((resolve,reject) => {
resolve(data)
});
}
}
main.service.spe c .ts:
fit("should get sites from the API - force API", fakeAsync(
inject(
[
MainService,
SettingService,
HttpTestingController
],
(
service: MainService,
settingService: SettingService,
backend: HttpTestingController
) => {
// spy
spyOn(settingService, "currentSetting").and.returnValue(
Promise.resolve({'measureBar':3});
);
service
.getData(true)
.then(receivedResponse => {
expect(receivedResponse).toEqual(3);
})
.catch(err => {});
const requestWrapper = backend.expectOne({
url: 'http://www.example.com'
});
requestWrapper.flush(3);
tick();
expect(requestWrapper.request.method).toEqual("GET");
}
)
));
Теперь ошибка
Error: Expected one matching request for criteria "Match method: (any), URL: www.example.com, found none.
но, глядя на мой консольный журнал, метод getData () не разрешает смоделированный метод currentSetting вообще или хотя бы вовремя.