Angular 5 - Angular firebase - Тестирование - имитация метода getDownloadURL

Мне сложно издеваться над методом getDownLoadURL, который консоль каждый раз показывает: TownhallPictureService должен возвращать уровень городской ратуши с помощью допустимого ввода FAILED TypeError: this.ref.getDownloadURL не является функцией

моя служба выглядит так:

@Injectable()
export class TownhallPictureService {

  public ref;

  constructor(private storage: AngularFireStorage) {
  }

  getTownHallPicture(townhall: number): Observable<string | null> {
    switch (townhall) {
      case 1:
        this.ref = this.storage.ref(TownhallImgSrc.TOWNHALL_ONE);
        break;
        ...
        break;
      case 11:
        this.ref = this.storage.ref(TownhallImgSrc.TOWNHALL_ELEVEN);
        break;
      default:
        return Observable.of(undefined);
    }
    return this.ref.getDownloadURL();
  }
}

И файл спецификации жасмина:

    describe('TownhallPictureService', () => {
  let spy;
  const angularFireMock = {
    ref(){
      function getDownloadURL() {}
    },
  };
  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [TownhallPictureService,
        {provide: AngularFireStorage, useValue: angularFireMock},
        ]
    });
    spy = TestBed.get(AngularFireStorage);
  });

  it('should be return townhall level by valid input', inject(
    [TownhallPictureService], (service: TownhallPictureService) => {
      const expectedTownhall: number = 9;
      const expectedPicture: string = TownhallImgSrc.TOWNHALL_NINE;

      spyOn(spy, 'ref').and.returnValue(Observable.of(TownhallImgSrc.TOWNHALL_NINE));

      service.getTownHallPicture(expectedTownhall).subscribe(result => {
        expect(result).toBe(expectedPicture);
      });
    }));

Кто-нибудь знает, как правильно издеваться над этим методом? Проблема здесь в том, что getDownloadURL - это метод из другого класса, поэтому мне нужен какой-то вложенный макет obj.

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
0
637
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для людей, которые используют AngularFirebaseStorage и хотят создавать модульные тесты для этой службы, это способ имитировать ref () и getDownloadURL (): Создайте FakeClass:

export class FirebaseMock {

  public ref(path: string) {
      return {
        getDownloadURL() {
          return Observable.of(path)
        }
      }
  }
}

И вставьте его в реальный конструктор класса, который нужно протестировать:

let mock: any;
  let service: TownhallPictureService;

  beforeEach(() => {
    mock = new FirebaseMock();
    service = new TownhallPictureService(mock);
  });

Есть ли способ использовать тот же ответ, но с TestBed.inject?

Bjarne Gerhardt-Pedersen 19.03.2020 15:30

Другие вопросы по теме