Мне сложно издеваться над методом 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.





Для людей, которые используют 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?