测试错误:组件不是任何 NgModule 的一部分,或者该模块尚未导入到您的模块中

Posted

技术标签:

【中文标题】测试错误:组件不是任何 NgModule 的一部分,或者该模块尚未导入到您的模块中【英文标题】:Test error: Component is not part of any NgModule or the module has not been imported into your module 【发布时间】:2018-12-27 19:57:09 【问题描述】:

我有两个模块:

模块 A 组件主页 组件展示 模块 B 组件自定义输入

app.module.ts(模块 A)

@NgModule(
    declarations: [
        HomeComponent,
        PresentationComponent
    ],
    imports: [
        ModuleB
    ]
)
export class AppModule 

presentation.component.html

<custom-input><custom-input>

presentation.component.spec.ts

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

    beforeEach(async(() => 
        TestBed.configureTestingModule(
            declarations: [PresentationComponent],
            imports: [ModuleB]
        )
        .compileComponents();
    ));

    beforeEach(() => 
        fixture = TestBed.createComponent(PresentationComponent);
        component = fixture.componentInstance;
        fixture.detectChanges();
    );

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

b.module.ts(模块 B)

@NgModule(
    declarations: [
        CustomInputComponent
    ],
    exports: [
        CustomInputComponent
    ]
)
export class ModubleB 

组件Presentation在其html中使用CustomInput标签,因此在模块B中,我导出CustomInputComponent然后将模块B导入模块A。

问题是,在Presentation Component的spec文件中,我还必须将Module B导入到Test Module中。但我有这个错误:

Component HomeComponent is not part of any NgModule or the module has not been imported into your module

我真的不明白为什么?有任何想法吗 ?谢谢!

【问题讨论】:

错误信息非常有用。在适当的模块声明数组中添加 HomeComponent。 是模块 A 你的app.module.ts @DevEng 是的 @bodorgergely 我已经在 app.module.ts 中声明了 HomeComponent(我的描述中是模块 A) 也许我必须直接导入CustomInputComponent,而不是模块B? 【参考方案1】:

您需要在您的BModule 中导出CustomInputComponent,以便您可以在其他模块及其组件中使用它,唉,在您的PresentationComponent 的模板中。在你的PresentationComponent的spec文件中你还需要导入BModule,因为你在组件中使用它,并且你需要单独测试组件,所以你必须提供你的组件需要的一切。

一个非常抽象的组件结构图:

AppModule

@NgModule(
  declarations: [AppComponent, HomeComponent, PresentationComponent],
  imports: [BrowserModule, BModule],
  bootstrap: [AppComponent]
)
export class AppModule  

应用组件

@Component(
  selector: 'app-root',
  template: `
    <app-home></app-home>
    <app-presentation></app-presentation>
  `,
  styles: [':host  display: block; border: 1px solid pink; color: pink; padding: 10px; ']
)
export class AppComponent  

AppComponent 规范

...
beforeEach(async(() => 
  TestBed.configureTestingModule(
    imports: [BModule],
    declarations: [AppComponent, HomeComponent, PresentationComponent]
  ).compileComponents();
));
...

主页组件

@Component(
  selector: 'app-home',
  template: `<p>home works!</p>`,
  styles: [':host  display: block; border: 1px solid orange; color: orange; padding: 10px; ']
)
export class HomeComponent  

HomeComponent 规范

...
beforeEach(async(() => 
  TestBed.configureTestingModule(
    declarations: [HomeComponent]
  ).compileComponents();
));
...

PresentationComponent

@Component(
  selector: 'app-presentation',
  template: `
    <p>presentation works!</p>
    <app-custom-input></app-custom-input>
  `,
  styles: [':host  display: block; border: 1px solid blue; color: blue; padding: 10px; ']
)
export class PresentationComponent  

PresentationComponent 规范

...
beforeEach(async(() => 
  TestBed.configureTestingModule(
    imports: [BModule], // has to import the module because you use its exported component in the PresentationComponent
    declarations: [PresentationComponent]
  ).compileComponents();
));
...

BModule

@NgModule(
  imports: [CommonModule],
  declarations: [CustomInputComponent],
  exports: [CustomInputComponent] // has to export the component to make it available to other modules
)
export class BModule  

自定义输入组件

@Component(
  selector: 'app-custom-input',
  template: `<p>custom-input works!</p>`,
  styles: [':host  display: block; border: 1px solid green; color: green; padding: 10px; ']
)
export class CustomInputComponent  

CustomInputComponent 规范

...
beforeEach(async(() => 
  TestBed.configureTestingModule(
    declarations: [CustomInputComponent]
  ).compileComponents();
));
...

【讨论】:

抱歉,我忘记将 CustomInputComponent 放在 BModule 的导出中。但即使我这样做了,我仍然有这个错误:“Component HomeComponent is not part of any NgModule” 所以如你所说,我尝试在PresentationComponent的测试文件中声明HomeComponent。在这种情况下,我有同样的错误,但对于应用程序模块中的另一个组件(我们称之为 CComponent)。 也许我应该在这个测试文件中导入 AppModule ?但这没有任何意义 你在 AppModule 中声明 HomeComponent 了吗? 当然可以,因为除了测试失败之外,一切正常(准确地说是我的主页)。很奇怪,可能是我的代码有问题(我的AppModule和BModule其实有30多个组件),但我还没有弄清楚真正的问题是什么。【参考方案2】:

试试 NO_ERRORS_SCHEMA。这应该可以解决您的问题。

【讨论】:

以上是关于测试错误:组件不是任何 NgModule 的一部分,或者该模块尚未导入到您的模块中的主要内容,如果未能解决你的问题,请参考以下文章

Component(组件)

Angular 4:未找到组件工厂,您是不是将其添加到 @NgModule.entryComponents?

Angular 4:未找到组件工厂,您是不是将其添加到 @NgModule.entryComponents?

无法绑定到'consoleMessages',因为它不是'app-console'的已知属性

错误输入:'组件选择器'不是已知元素:在angular 5 app上运行ng-build

javascript 错误:找不到组件工厂。你有没有把它添加到@ NgModule.entryComponents