Я следую официальному учебнику по Angular, чтобы протестировать компонент, вызывающий асинхронную сервисную функцию: https://angular.io/guide/testing#component-with-async-service
Создание шпиона:
const gardenSpy = jasmine.createSpyObj('GardenService', ['getGardens', 'createGarden']);
gardenSpy.getGardens.and.returnValue(of(testGardens));
...
gardenServiceSpy = TestBed.get(GardenService);
Настройка TestBed для использования моегошпион вместо действительной службы:
TestBed.configureTestingModule({
declarations: [ MyGardensComponent ],
providers: [
{ provide: GardenService, useValue: gardenSpy }
],
imports: [FormsModule, HttpClientTestingModule]
})
.compileComponents();
Затем модульный тест, который не проходит:
it('should load the gardens', () => {
fixture.detectChanges();
component.getGardens();
expect(gardenServiceSpy.getGardens.calls.any()).toBe(true, 'getGardens called');
});
Как видно из отчета о покрытии, метод подписки никогда не выполняетсяи утверждение шпиона не выполняется.
отчет о покрытии
В соответствии с руководством по Angular этот метод должен работать и позволять мне возвращать наблюдаемое синхронно.Вызов метода шпиона вручную работает и возвращает правильно, поэтому я предполагаю, что есть проблема с внедрением шпионского сервиса, а не с созданием самого шпиона.Буду признателен за любую помощь!
Если вам нужно просмотреть файлы целиком, я сделал punker здесь (на самом деле не запускается, просто для просмотра файлов)