Эта проблема может возникнуть при тестировании компонента, который создает экземпляр дочернего компонента, который также внедряет службу, используя HttpClient
.
Для иллюстрации рассмотрим следующие компоненты:
@Component({
selector: 'app-parent-component',
template: `<app-child-component></app-child-component>`
})
export class ParentComponent {
constructor(private service: FooService) { }
}
@Component({
selector: 'app-child-component',
})
export class ChildComponent {
constructor(private service: BarService) { }
}
Предположимчто и FooService
, и BarService
вводят HttpClient
.
В соответствии с документацией тест, настроенный для ParentComponent
, может выглядеть примерно так:
beforeEach(async(() => {
const mockService = jasmine.createSpyObject(['fooMethod']);
TestBed.configureTestingModule({
declarations: [ParentComponent],
providers: [
{
provide: FooService,
useValue: mockService,
},
],
}).compileComponents();
}));
Однако, когда angular
создает экземпляр ParentComponent
, а также создает ChildComponent
, который должен ввести BarService
.Так как вы не сказали TestBed
предоставить макет, он предоставляет реальную услугу, которая, в свою очередь, зависит от HttpClient
.
Существует несколько решений.Если вы хотите проверить интеграцию ParentComponent
и ChildComponent
, самое простое, что вам нужно сделать - это сказать TestBed
, чтобы высмеивать BarService
, требуемый ребенком.Если вы хотите поддерживать строгий модульный тест, вы можете предоставить поддельный дочерний компонент, который не внедряет службу HttpClient
в TestBed
:
@Component {(
selector: 'app-child-component'
)}
export class MockChildComponent {
constructor() { }
}
, и настроить тест следующим образом:
TestBed.configureTestingModule({
declarations: [ParentComponent, ChildComponent],
providers: [
{
provide: Service,
useValue: mockService,
},
],
}).compileComponents();
Или вы можете переопределить создание экземпляра компонента, сказав TestBed
использовать CUSTOM_ELEMENTS_SCHEMA
:
TestBed.configureTestingModule({
declarations: [ParentComponent],
providers: [
{
provide: Service,
useValue: mockService,
},
],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
}).compileComponents();