私は githubリポジトリ (angular 7とangular-cliを使用)を開発していますが、masterブランチでKarmaとJasmineを使用したいくつかのテストがあります。
今、私は遅延読み込み機能を追加しようとしていますが、問題は、以前に合格したテストが現在はそうではないということです。面倒なのは、遅延読み込みモジュールのテストのみが失敗しているためです...
コードとエラーは次のとおりです。
import {async, TestBed} from '@angular/core/testing';
import {APP_BASE_HREF} from '@angular/common';
import {AppModule} from '../../app.module';
import {HeroDetailComponent} from './hero-detail.component';
describe('HeroDetailComponent', () => {
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [AppModule
],
providers: [
{provide: APP_BASE_HREF, useValue: '/'}
],
}).compileComponents();
}));
it('should create hero detail component', (() => {
const fixture = TestBed.createComponent(HeroDetailComponent);
const component = fixture.debugElement.componentInstance;
expect(component).toBeTruthy();
}));
});
エラーはこれです:
Chrome 58.0.3029 (Mac OS X 10.12.6) HeroDetailComponent should create hero detail component FAILED
Error: Illegal state: Could not load the summary for directive HeroDetailComponent.
at syntaxError Users/ismael.ramos.silvan/WebstormProjects/angular4-example-app/~/@angular/compiler/@angular/compiler.es5.js:1690:22)
at CompileMetadataResolver.getDirectiveSummary Users/ismael.ramos.silvan/WebstormProjects/angular4-example-app/~/@angular/compiler/@angular/compiler.es5.js:15272:1)
at JitCompiler.getComponentFactory Users/ismael.ramos.silvan/WebstormProjects/angular4-example-app/~/@angular/compiler/@angular/compiler.es5.js:26733:26)
at TestingCompilerImpl.getComponentFactory Users/ismael.ramos.silvan/WebstormProjects/angular4-example-app/~/@angular/compiler/@angular/compiler/testing.es5.js:484:1)
at TestBed.createComponent Users/ismael.ramos.silvan/WebstormProjects/angular4-example-app/~/@angular/core/@angular/core/testing.es5.js:874:1)
at Function.TestBed.createComponent Users/ismael.ramos.silvan/WebstormProjects/angular4-example-app/~/@angular/core/@angular/core/testing.es5.js:652:1)
at UserContext.it Users/ismael.ramos.silvan/WebstormProjects/angular4-example-app/src/app/heroes/hero-detail/hero-detail.component.spec.ts:18:29)
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invoke Users/ismael.ramos.silvan/WebstormProjects/angular4-example-app/~/zone.js/dist/zone.js:391:1)
at ProxyZoneSpec.onInvoke Users/ismael.ramos.silvan/WebstormProjects/angular4-example-app/~/zone.js/dist/proxy.js:79:1)
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invoke Users/ismael.ramos.silvan/WebstormProjects/angular4-example-app/~/zone.js/dist/zone.js:390:1)
必要に応じて、プロジェクト全体を表示して詳細を確認できます。
更新:次のような宣言を追加しました:
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
AppModule
],
declarations: [HeroDetailComponent],
providers: [
{provide: APP_BASE_HREF, useValue: '/'}
],
}).compileComponents();
}));
現在、新しいエラーが表示されます。
The pipe 'translate' could not be found ("<h1 class="section-title">{{[ERROR ->]'heroDetail' | translate}}</h1>
<md-progress-spinner *ngIf="!hero"
class="progre"): ng:///DynamicTestModule/HeroDetailComponent.html@0:28
Can't bind to 'color' since it isn't a known property of 'md-progress-spinner'.
その他...角材からのすべてのディレクティブとコンポーネント、およびngx-translate/coreからのパイプ変換が含まれていないようです...
更新:最終的な解決策
問題は、HeroesModuleがどこにもインポートされていないことでした。 これは、HeroesModuleが最初の問題であったHeroDetailComponentを宣言するために機能します:
import {async, TestBed} from '@angular/core/testing';
import {APP_BASE_HREF} from '@angular/common';
import {AppModule} from '../../app.module';
import {HeroDetailComponent} from './hero-detail.component';
import {HeroesModule} from '../heroes.module';
describe('HeroDetailComponent', () => {
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
AppModule,
HeroesModule
],
providers: [
{provide: APP_BASE_HREF, useValue: '/'}
],
}).compileComponents();
}));
it('should create hero detail component', (() => {
const fixture = TestBed.createComponent(HeroDetailComponent);
const component = fixture.debugElement.componentInstance;
expect(component).toBeTruthy();
}));
});
最初にコンポーネントを宣言せずにHeroDetailComponent
をTestBed.createComponent()
に渡しました。
TestBed.configureTestingModule({
imports: [AppModule,
CommonModule,
FormsModule,
SharedModule,
HeroRoutingModule,
ReactiveFormsModule
],
providers: [
{provide: APP_BASE_HREF, useValue: '/'}
],
declarations: [HeroDetailComponent]
}).compileComponents();
それが役に立てば幸い。
テストでの次のエラーの更新:インポートをいくつか追加しました(基本的にインポートして提供したいので、HeroModuleを青写真として取得してください)。
宣言が欠落しているため、テストするクラスを宣言に追加する必要があります。
declarations: [component]
私の同僚と私はこの問題を抱えていましたが、修正はインターネット上の他のものとは大きく異なりました。
Visual Studio Codeを使用しており、フォルダー名は大文字と小文字を区別しません。そのため、すべてのユーザーに小文字の命名規則を使用するように依頼しましたが、最終的には大文字の名前がソース管理に組み込まれました。ラウンドアバウトで名前を変更しましたが、すべて問題ありませんでした。
1か月後、同僚はこのエラーメッセージで特定の単体テストを中断し始めました。彼のコンピューターだけがそのテストで壊れていました。テストに影響を与える可能性のあるすべてのコードを文字通りコメントアウトしましたが、それでもエラーが発生しました。最後に、クラスをグローバルに検索しましたが、フォルダー名が大文字に戻ったことがわかりました。名前を小文字に戻し、保留中の変更を認識せずに追加します...そしてテストは機能しました。
スタイルガイドに従うためのレッスンにしましょう。 :)
明確にするために、この修正はフォルダー名FOO
をfoo
に変更するのと似ていました。
このタイプのエラーは、TestBed構成のプロバイダーの宣言およびサービスにコンポーネントを追加できないために発生します。
beforeEach(() => {
TestBed.configureTestingModule({
imports: [RouterTestingModule.withRoutes([
{ path: 'home', component: DummyComponent },
{ path: 'patients/find', component: DummyComponent }
])],
declarations: [RoutingComponent, DummyComponent,BreadcrumbComponent],
providers : [BreadCrumbService]
});
コンポーネントHeroDetailComponentを正しい方法でインポートする必要があります。 注意文字が大文字であってもパスに問題があること。つまり、( '@ angular/forms'は正しい、BUT '@ angular/Forms'は正しくありません。