15

Мы используеммодифицирующим компонентом определено в TestBed.overrideComponent

TestBed.overrideComponent(CoolComponent, { 
    set: { 
     template: '<div id="fake-component">i am the fake component</div>', 
     selector: 'our-cool-component', 
     inputs: [ 'model' ] 
    } 
    }) 

переопределить компонент.

компонент имеет ViewChild, который мы настраиваем в нашем методе ngOnInit

@Component({ 
    selector: 'our-cool-component', 
    templateUrl: 'cool.component.html' 
}) 
export class CoolComponent implements OnInit, OnDestroy { 
    @Input() model: SomeModel 
    @ViewChild(CoolChildComponent) coolChildComponent; 

    ngOnInit() { 
    this.coolChildComponent.doStuff(); 
    } 
} 

CoolComponent в свою очередь, живет в Wrapper компоненте.

Когда мы называем fixture.detectChanges() на Wrapper арматуре, это попытка построить CoolComponent, но он сразу же умирает, когда он вызывает DoStuff(), потому что CoolChildComponent не определено.

Есть ли способ добраться до CoolComponent, чтобы заглушить его CoolChildComponent? Не похоже, что мы можем получить его с Wrapper, потому что он ссылается только на шаблон, а не как свойство компонента.

+1

Я только что добавил щедрость, видимо, вы не сообщили (http://meta.stackoverflow.com/q/333838/3001761) – jonrsharpe

+0

Это когда-либо работало? Работает ли он, когда вы запускаете его в браузере (или как вы планируете)? Является ли это проблемой только для тестирования? – j2L4e

ответ

7
ngOnInit() { 
    this.coolChildComponent.doStuff(); 
} 

должен быть

ngAfterViewInit() { 
    this.coolChildComponent.doStuff(); 
} 

because

Посмотреть ребенок установлен до обратного вызова ngAfterViewInit называется.

+0

делает это? –

+0

Нет, для меня это не имеет значения. – conor