由于构造函数中的组件,角度单元测试失败。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了由于构造函数中的组件,角度单元测试失败。相关的知识,希望对你有一定的参考价值。

我有一个使用它的构造函数:

  constructor(
    public core: CoreComponent,
  ) {
   //
  }

但是当我尝试用这样的测试用例测试这些组件时:

describe('CoreSubMenuComponent', () => {
  let component: CoreSubMenuComponent;
  let fixture: ComponentFixture<CoreSubMenuComponent>;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [
        TestingModule.forRoot(),
      ]
    }).compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(CoreSubMenuComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  });

  it('should create', () => {
    expect(component).toBeTruthy();
  });
});

我得到一个空注射器错误:

Error: StaticInjectorError(DynamicTestModule)[CoreSubMenuComponent -> CoreComponent]: 
  StaticInjectorError(Platform: core)[CoreSubMenuComponent -> CoreComponent]: 
    NullInjectorError: No provider for CoreComponent!

它被导入到testingModule中,因此不是问题。我也尝试将它添加到providers数组中。但这只是将它移动到角度渲染器,该渲染器无法添加到providers数组中。我还在@injectable()@component标签之前添加了一个CoreComponent标签,但它没有改变我的测试失败。

我尝试用@host()获取它,但它抛出一个错误。我也试图用Injector得到它,但这也引发了一个错误。这些是使用CoreComponent作为var的4个组件从它们获取一些信息,但它们使测试失败。我所有的其他测试都通过了超过80次测试。只是这4个不起作用,因为他们试图获得在CoreComponent中定义的属性。

有人知道我如何用一个实例引用这个组件,以便我的测试通过吗?

答案

要修复此错误,请使用@host en @optional装饰器。这告诉编译器要查找它,但如果没有提供则不需要:

  constructor(
    @Host() @Optional() public core: CoreComponent,
  ) {
    //
  }

以上是关于由于构造函数中的组件,角度单元测试失败。的主要内容,如果未能解决你的问题,请参考以下文章

角度单元测试:失败:模块“DynamicTestModule”导入的意外值“DxTemplateHost”:添加@NgModule 注释

对于单元测试中没有构造函数的扩展类,Angular 10 依赖注入失败

角度单元测试 - 注入失败[重复]

从角度应用程序访问角度库 - 角度组件中的 StaticInjectorError 与构造函数中的 ElementRef

以角度 6 将参数从组件发送到服务构造函数

这些角度电子邮件指令代码片段如何连接