Angular 为角度组件测试生成@Component definitions运行时
我有一个要测试的11角组件:Angular 为角度组件测试生成@Component definitions运行时,angular,typescript,Angular,Typescript,我有一个要测试的11角组件: @Component({ selector: 'app-foo-page', template: ` <app-header mode='operational' cool='true'></app-header> Some content ` }) export class FooPageComponent { } 但我通常更喜欢这个 @Component({ selector: 'app-header', t
@Component({
selector: 'app-foo-page',
template: `
<app-header mode='operational' cool='true'></app-header>
Some content
`
})
export class FooPageComponent { }
但我通常更喜欢这个
@Component({ selector: 'app-header', template: 'dummy' })
class DummyHeaderComponent {
@Input() mode = 'operational';
@Input() cool = true;
}
// ...
setUpTestBed({
declarations: [
FooPageComponent,
DummyHeaderComponent,
],
问题来了:我可以创建一个函数来返回这样的“虚拟”组件吗?我想把它简化成一个助手方法,在测试我的页面时,我可以使用它来构建声明
,而不必每次都创建一个显式的虚拟组件
换言之,我希望我能写:
function generateDummyComponentDefinition(selector, inputs) {
// Return a class or constructor function
// ...that is @Component(...) decorated properly
// ...that has @Input() properties as specified
}
// ...
setUpTestBed({
declarations: [
FooPageComponent,
generateDummyComponentDefinition('app-header', ['mode', 'cool']),
],
我通读了一遍,但与实际情况的差距有点大
我想要的是可能的吗?我认为使用以下动态代码应该是可能的:
function generateDummyComponentDefinition(selector: string, inputs: string[]) {
@Component({
selector,
template: 'dummy'
})
class DummyComponent {
static propDecorators = inputs.reduce((acc, input) => {
acc[input] = [{type: Input}];
return acc;
}, {});
}
return DummyComponent;
}
Angular编译器可以识别
propDecorators
,它应该是所有属性的decorators的对象。旁注:propDecorators
依赖Angular的内部,还是公共API的一部分?(换言之:这可能会在未来的主要Angular更新中中断吗?)。它部分是私人的,但另一方面是公共的,因为图书馆使用它
function generateDummyComponentDefinition(selector: string, inputs: string[]) {
@Component({
selector,
template: 'dummy'
})
class DummyComponent {
static propDecorators = inputs.reduce((acc, input) => {
acc[input] = [{type: Input}];
return acc;
}, {});
}
return DummyComponent;
}