Angular 2 Karma Test'component-name'不是已知元素

Ang*_*Pan 81 javascript node.js typescript karma-jasmine angular

在AppComponent中,我在HTML代码中使用nav组件.用户界面看起来很好.做服务时没有错误.当我查看应用程序时,控制台中没有错误.

但是当我为我的项目运行Karma时,出现了一个错误:

Failed: Template parse errors: 
'app-nav' is not a known element:
1. If 'app-nav' is an Angular component, then verify that it is part of this module.
2. If 'app-nav' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the '@NgModule.schemas' of this component to suppress this message.
Run Code Online (Sandbox Code Playgroud)

在我的app.module.ts中:

有:

import { NavComponent } from './nav/nav.component';
Run Code Online (Sandbox Code Playgroud)

它也在NgModule的声明部分

@NgModule({
  declarations: [
    AppComponent,
    CafeComponent,
    ModalComponent,
    NavComponent,
    NewsFeedComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule,
    JsonpModule,
    ModalModule.forRoot(),
    ModalModule,
    NgbModule.forRoot(),
    BootstrapModalModule,
    AppRoutingModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
Run Code Online (Sandbox Code Playgroud)

我正在使用NavComponent我的AppComponent

app.component.ts

import { Component, ViewContainerRef } from '@angular/core';
import { Overlay } from 'angular2-modal';
import { Modal } from 'angular2-modal/plugins/bootstrap';
import { NavComponent } from './nav/nav.component';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'Angela';
}
Run Code Online (Sandbox Code Playgroud)

app.component.html

<app-nav></app-nav>
<div class="container-fluid">
</div>
Run Code Online (Sandbox Code Playgroud)

我已经看到了一个类似的问题,但是那个问题的答案是我们应该在导航组件中添加NgModule,其中有导出,但是当我这样做时我遇到了编译错误.

还有:app.component.spec.ts

import {NavComponent} from './nav/nav.component';
import { TestBed, async } from '@angular/core/testing';
import { AppComponent } from './app.component';
Run Code Online (Sandbox Code Playgroud)

Kim*_*ern 133

因为在单元测试中,您希望测试主要与应用程序的其他部分隔离的组件,所以Angular默认情况下不会添加模块的依赖关系,如组件,服务等.所以你需要在测试中手动完成.基本上,这里有两个选项:

A)在测试中声明原始的NavComponent

describe('AppComponent', () => {
  beforeEach(async(() => {
      TestBed.configureTestingModule({
        declarations: [
          AppComponent,
          NavComponent
        ]
      }).compileComponents();
    }));
Run Code Online (Sandbox Code Playgroud)

B)模拟NavComponent

describe('AppComponent', () => {
  beforeEach(async(() => {
      TestBed.configureTestingModule({
        declarations: [
          AppComponent,
          MockNavComponent
        ]
      }).compileComponents();
    }));

// it(...) test cases 

});

@Component({
  selector: 'app-nav',
  template: ''
})
class MockNavComponent {
}
Run Code Online (Sandbox Code Playgroud)

您可以在官方文档中找到更多信息.

  • @jonathan也许你声明的组件有它自己的依赖项?在单元测试中,最好使用模拟。 (3认同)
  • 谢谢你。我遇到了必须导入多个组件和模块的问题,以至于在 TestBed 配置中导入“AppModule”更有意义。你会建议反对吗? (2认同)

小智 6

您也可以使用 NO_ERRORS_SCHEMA

describe('AppComponent', () => {
beforeEach(async(() => {
  TestBed.configureTestingModule({
    declarations: [
      AppComponent
    ],
    schemas: [NO_ERRORS_SCHEMA]
  }).compileComponents();
}));
Run Code Online (Sandbox Code Playgroud)

https://www.ng-conf.org/mocking-dependencies-angular/

  • 这就是[测试文档](https://angular.io/guide/testing#no_errors_schema)所说的:“ NO_ERRORS_SCHEMA还可防止编译器告诉您有关您无意中遗漏或拼写错误的缺失组件和属性。您可以浪费了很多时间去追寻编译器会立即捕获的幻像错误。” (7认同)
  • 有什么潜在的潜在问题吗?看来这是一个方便的修复程序,但是有没有重要的错误可以解决? (3认同)
  • 您绝对不会在单元测试中引入额外的隐式行为:使用NO_ERRORS_SCHEMA会鼓励您将依赖项放入“模拟”与“拉入”之间的“灰色”区域。对这些依赖项的任何更改都可能触发看似无关的单元测试的中断-不好 (2认同)