Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 为角度组件测试生成@Component definitions运行时_Angular_Typescript - Fatal编程技术网

Angular 为角度组件测试生成@Component definitions运行时

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

我有一个要测试的11角组件:

@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;
}