Angular 2 Karma 테스트 'component-name'은 알려진 요소가 아닙니다.


105

AppComponent에서는 HTML 코드의 nav 구성 요소를 사용하고 있습니다. UI가 괜찮아 보입니다. ng 서브를 할 때 오류가 없습니다. 앱을 볼 때 콘솔에 오류가 없습니다.

하지만 내 프로젝트를 위해 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.

app.module.ts에서 :

있다 :

import { NavComponent } from './nav/nav.component';

NgModule의 선언 부분에도 있습니다.

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

나는 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';
}

app.component.html

<app-nav></app-nav>
<div class="container-fluid">
</div>

나는 비슷한 질문을 보았지만 그 질문에 대한 대답은 내보내기가있는 nav 구성 요소에 NgModule을 추가해야한다고 말하지만 그렇게하면 컴파일 오류가 발생합니다.

또한 : app.component.spec.ts

import {NavComponent} from './nav/nav.component';
import { TestBed, async } from '@angular/core/testing';
import { AppComponent } from './app.component';

사양 파일에 가져 오기가 누락되었을 수 있습니다. 당신이 원하는 것, 그래서 나는, 사양 테스트가 app.spec.ts에 있으리라 믿고있어 import { NavComponent }귀하의 spec.ts에서
Z. 베이글

1
가져 왔습니다. 나는 선언 부분을 잃어버린
안젤라 P

1
app.component.spec.ts 내에서 사용자 정의 구성 요소를 가져오고 선언하는 것이 저에게 효과적이었습니다. 감사합니다!
ENDEESA

답변:


161

단위 테스트에서는 애플리케이션의 다른 부분에서 대부분 격리 된 구성 요소를 테스트하려고하기 때문에 Angular는 기본적으로 구성 요소, 서비스 등과 같은 모듈의 종속성을 추가하지 않습니다. 따라서 테스트에서 수동으로 수행해야합니다. 기본적으로 여기에는 두 가지 옵션이 있습니다.

A) 테스트에서 원래 NavComponent 선언

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

B) NavComponent 모의

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

// it(...) test cases 

});

@Component({
  selector: 'app-nav',
  template: ''
})
class MockNavComponent {
}

공식 문서 에서 자세한 정보를 찾을 수 있습니다 .


고마워 ... 나를 위해 일했다 !!
Hidayt Rahman 2018

1
감사합니다. 여러 구성 요소와 모듈을 AppModuleTestBed 구성에서 가져 오는 것이 훨씬 더 합리적인 지점까지 가져와야하는 문제 에 직면했습니다. 이것에 대해 추천 하시겠습니까?
mcheah dec

@jonathan 당신이 선언 한 컴포넌트가 그 자체의 의존성을 가지고있는 것일까 요? 단위 테스트에서는 모의를 사용하는 것이 좋습니다.
Kim Kern

8

당신은 또한 사용할 수 있습니다 NO_ERRORS_SCHEMA

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

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


3
이로 인해 발생할 수있는 잠재적 인 문제가 있습니까? 편리한 수정처럼 보이지만 이로 인해 제거 될 중요한 오류가 있습니까?
mcheah

8
이것은 무엇을 테스트 문서는 말한다 : ". NO_ERRORS_SCHEMA 또한 누락 된 구성 요소에 대해 이야기에서 컴파일러를 방지하고 실수로 생략되거나 맞춤법이 틀린 것을 속성 컴파일러가 순식간에 잡은 것이라고 팬텀 버그를 쫓는 시간을 낭비 할 수있다."
Kim Kern

5
단위 테스트에 추가적인 암시 적 동작을 도입하지 않을 것입니다. NO_ERRORS_SCHEMA를 사용하면 'mocked'와 'pulled in'사이의 '회색'영역에 종속성을 넣도록 권장합니다. 이러한 의존성에 대한 변경은 잠재적으로 관련이 없어 보이는 단위 테스트의 파괴 트리거 할 수 없다 - 더 좋은
averasko

0

나를 위해 부모의 구성 요소를 가져 와서 문제가 해결되었습니다.

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

spec of the parent이 컴포넌트가 사용되는 곳에 이것을 추가하십시오 .


0

또 하나의 이유는 여러가있을 수 있다는 것입니다 .compileComponents()에 대한 beforeEach()테스트 케이스

예를 들어

beforeEach(async(() => {
  TestBed.configureTestingModule({
    declarations: [TestComponent]
  }).compileComponents();
}));

beforeEach(() => {
  TestBed.configureTestingModule({
    imports: [HttpClientModule],
    declarations: [Test1Component],
    providers: [HttpErrorHandlerService]
  }).compileComponents();
});

0

1 단계 : 사양 파일 시작 부분에 스텁을 만듭니다.

@Component({selector: 'app-nav', template: ''})
class NavComponent{}

2 단계 : 구성 요소 선언에 스텁을 추가합니다.

TestBed.configureTestingModule({
  imports: [
    RouterTestingModule
  ],
  declarations: [
    AppComponent,
    NavComponent
  ],
}).compileComponents();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.