#unit-testing #angular #karma-jasmine
#модульное тестирование #angular #карма-жасмин
Вопрос:
Как мне имитировать сервис, который зависит от другого сервиса, находящегося в компоненте? Пожалуйста, проверьте приведенный ниже код.
a.component.ts
@Component({
selector: 'my-comp',
templateUrl: './my.component.html',
providers: [ MyServiceA ]
})
export class MyComponent {
my-service-a.service.ts
@Injectable()
export class MyServiceA{
constructor(private myServiceB: MyServiceB) {}
my-service-b.service.ts
export class MyServiceB{
constructor(private myServiceC: MyServiceC,
private myServiceD: MyServiceD) {}
Как мне имитировать сервис в a.component.spec.ts в конфигурации тестового стенда? Пожалуйста, помогите. Спасибо.
Ответ №1:
Вы можете имитировать это так, как хотите. Другие сервисы не имеют значения. Я думаю, возможно, проблема, с которой вы столкнулись, связана с @Component.providers
. Используя это, любые макеты, которые вы настраиваете в TestBed
, не используются как @Component.providers
имеющие приоритет, заставляя Angular пытаться создать его вместо использования макета.
Чтобы обойти это, Angular предлагает TestBed.overrideComponent
метод, позволяющий переопределять такие вещи, как шаблон и поставщики @Component
beforeEach(() => {
let myMockService = new MyMockService();
TestBed.configureTestingModule({
providers: [
// the following will not be used
{ provide: MyService, useValue: myMockService }
]
});
TestBed.overrideComponent(MyComponent, {
set: {
providers: [
// this will override the @Component.providers:[MyService]
{ provide: MyService, useValue: myMockService }
]
}
});
})