Açısal 2 Karma Testi 'bileşen-adı' bilinen bir öğe değil


106

AppComponent'te, HTML kodunda nav bileşenini kullanıyorum. UI iyi görünüyor. Ng servisi yaparken hata yok. ve uygulamaya baktığımda konsolda hata yok.

Ancak projem için Karma'yı çalıştırdığımda bir hata oluşuyor:

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.

Benim app.module.ts dosyamda :

var:

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

Ayrıca NgModule'ün bildirimler kısmında da yer almaktadır.

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

Ben kullanıyorum NavComponentiçinde benimAppComponent

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>

Benzer bir soru görmüştüm, ancak bu sorunun cevabı, NgModule'ü içinde bir dışa aktarım olan nav bileşenine eklememiz gerektiğini söylüyor, ancak bunu yaptığımda derleme hatası alıyorum.

Ayrıca: app.component.spec.ts

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

Muhtemelen spesifikasyon dosyanızda bir içe aktarma eksik. Eğer isteyeceksiniz yüzden, Spec testi app.spec.ts üzerinde olduğunu varsayarak yaşıyorum import { NavComponent }senin spec.ts içinde
Z. Bagley

1
ithal edildi. Beyan kısmını kaçırıyordum
Angela P

1
App.component.spec.ts içindeki özel bileşeni içe aktarmak ve beyan etmek benim için çalıştı, teşekkürler çocuklar!
ENDEESA

Yanıtlar:


162

Birim testlerinde, çoğunlukla uygulamanızın diğer bölümlerinden izole edilmiş bileşeni test etmek istediğiniz için, Angular modülünüzün bileşenler, hizmetler vb. Gibi bağımlılıklarını varsayılan olarak eklemeyecektir. Yani bunu testlerinizde manuel olarak yapmanız gerekiyor. Temel olarak burada iki seçeneğiniz var:

A) Testte orijinal NavComponent'i beyan edin

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

B) NavComponent ile alay edin

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

// it(...) test cases 

});

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

Resmi belgelerde daha fazla bilgi bulacaksınız .


Teşekkürler ... Benim için çalıştı !!
Hidayt Rahman

1
Bunun için teşekkürler. Birden fazla bileşeni ve modülü, yalnızca AppModuleTestBed yapılandırmasında içe aktarmanın çok daha mantıklı olduğu noktaya kadar içe aktarmak zorunda kalma sorunuyla karşılaştım. Buna karşı tavsiye eder misin?
mcheah

@jonathan, beyan ettiğiniz bileşenin kendi bağımlılıkları olabilir mi? Bir birim testinde, taklit kullanmak daha iyidir.
Kim Kern

8

Ayrıca kullanabilirsiniz 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
bundan doğacak olası sorunlar var mı? Uygun bir düzeltme gibi görünüyor, ancak bununla ortadan kaldırılacak önemli hatalar var mı?
mcheah

8
Bu nedir test dokümanlar ki: "NO_ERRORS_SCHEMA da eksik bileşenler hakkında size söylemekten derleyici engeller ve istemeden ihmal veya yanlış yazılmış olduğunu niteliklerini Sen derleyici anında yakalanmış olurdu hayali bitmez saatler atık olabilir."
Kim Kern

5
Birim testlerinize kesinlikle ekstra örtük davranışlar katmayacaksınız: NO_ERRORS_SCHEMA kullanmak sizi bağımlılıkları 'alay edilen' ve 'içeri alınan' arasındaki 'gri' bölgeye koymaya teşvik edecektir. bu bağımlılıklardaki herhangi bir değişiklik, görünüşte alakasız birim testlerinin kırılmasını tetikleyebilir - iyi değil
averasko

0

Üst öğeye bileşeni içe aktarmak benim için sorunu çözdü.

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

Bunu, spec of the parentbu bileşenin kullanıldığı yere ekleyin .


0

Bir neden daha, birden fazla .compileComponents() içinbeforeEach() test durumda

örneğin

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

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

0

Adım 1: Spesifikasyon dosyasının başlangıcında taslaklar oluşturun.

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

Adım 2: Bileşen bildirimlerine saplamalar ekleyin.

TestBed.configureTestingModule({
  imports: [
    RouterTestingModule
  ],
  declarations: [
    AppComponent,
    NavComponent
  ],
}).compileComponents();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.