我MainComponent
使用ChildComponentA
作为@ViewChild
。 MainComponent
正在调用ChildComponentA
上的方法。
我想编写一个模拟ChildComponentA
的单元测试用例。如何使用TestBed
(在Angular 2 RC5中)执行此操作?
在我以前使用overrideDirective(MainComponentName, ChildComponentA, MockChildComponentA);
之前使用TestBed
还有相同的内容吗?
我尝试使用
TestBed.overrideComponent(ChildComponentA,{
set: {
template: '<div></div>'
}
});
只是设置模板,但我也想模拟组件中的方法。
答案 0 :(得分:4)
我认为在这种情况下,您可以尝试使用模拟组件替换子组件。只需使用相同的选择器创建一个模拟组件,并使用TestBed删除真实子组件的声明,并将声明添加到模拟组件。
@Component({
selector: 'child',
template: '<div></div>'
})
class MockComponent {
}
在测试中,请使用模拟组件:
TestBed.configureTestingModule({
imports: [MyModule],
declarations: [ParentComponent, MockComponent]
});
TestBed.overrideModule(MyModule, {
remove: {
declarations: [ParentComponent, ChildComponent],
exports: [ParentComponent, ChildComponent]
}
});
此处有更多详情:https://github.com/angular/angular/issues/10689。 确保重新声明ParentComponent,否则它不起作用(不确定原因)。
如果使用@ViewChild获取对子组件的引用,则需要将其修改为不使用组件的类型,而是使用id。使用@ViewChild('child')代替@ViewChild(ChildComponent)。请参阅此处的第二个示例:http://learnangular2.com/viewChild/
答案 1 :(得分:0)
请注意,如果ChildComponent
是在TestModule本身中声明的,则无需覆盖声明原始模块的模块。
因此,如果您的TestBed声明如下所示:
TestBed.configureTestingModule({
declarations: [
ParentComponent,
ChildComponent // This is what you'd like to mock
]
});
然后,要覆盖ChildComponent
,您需要做的是:
@Component({
selector: 'child',
template: '<div></div>'
})
class MockChildComponent {
}
TestBed.configureTestingModule({
declarations: [
ParentComponent,
MockChildComponent // Notice the original is replaced by the mock
]
});
只要ChildComponent
和MockChildComponent
具有相同的选择器,该选择器就应该起作用。
为此问题提供的另一个答案适用于将ChildComponent
从另一个模块带入测试床的情况。
如果您的ChildComponent
有任何@Input
或@Output
,则也将它们包括在您的MockChildComponent
中。