при использовании обещаний выполнение останавливается - PullRequest
0 голосов
/ 05 февраля 2020

Методы класса были наблюдаемыми, и тесты работали нормально. Теперь требования изменились, и имело больше смысла давать им обещания, но теперь я не могу настроить юнит-тест. У меня есть этот довольно простой класс с одним методом 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 вообще или хотя бы вовремя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...