@@ -531,9 +531,8 @@ IMPORTANT: `click()`ヘルパー関数は、Angularのテストユーティリ
531531
532532<docs-code header =" app/dashboard/dashboard-hero.component.spec.ts (test host setup) " path =" adev/src/content/examples/testing/src/app/dashboard/dashboard-hero.component.spec.ts " visibleRegion =" test-host-setup " />
533533
534- このテストモジュール設定は、3つの重要な違いを示しています 。
534+ このテストモジュール設定は、2つの重要な違いを示しています 。
535535
536- * ` DashboardHeroComponent ` と` TestHostComponent ` の両方を* インポート* します
537536* ` DashboardHeroComponent ` ではなく` TestHostComponent ` を* 作成* します
538537* ` TestHostComponent ` は、バインディングで` DashboardHeroComponent.hero ` を設定します
539538
@@ -588,23 +587,6 @@ Here are the services injected into `HeroDetailComponent`:
588587
589588テストでは、異なるルートにナビゲートすることで、` HeroDetailComponent ` が異なる` id ` パラメーター値にどのように応答するかを調べることができます。
590589
591- ### ` RouterTestingHarness ` によるテスト
592-
593- 次に、観察された` id ` が既存のヒーローを参照している場合に、コンポーネントの動作を示すテストを示します。
594-
595- <docs-code header =" app/hero/hero-detail.component.spec.ts (existing id) " path =" adev/src/content/examples/testing/src/app/hero/hero-detail.component.spec.ts " visibleRegion =" route-good-id " />
596-
597- HELPFUL: 後のセクションでは、` createComponent() ` メソッドと` page ` オブジェクトについて説明します。
598- 今のところ、直感的に理解してください。
599-
600- ` id ` が見つからない場合、コンポーネントは` HeroListComponent ` にリダイレクトする必要があります。
601-
602- テストスイートの設定では、同じルーターハーネスが提供されました[ 上記を参照] ( #routing-component ) 。
603-
604- このテストは、コンポーネントが` HeroListComponent ` へのナビゲーションを試みると予想しています。
605-
606- <docs-code header =" app/hero/hero-detail.component.spec.ts (bad id) " path =" adev/src/content/examples/testing/src/app/hero/hero-detail.component.spec.ts " visibleRegion =" route-bad-id " />
607-
608590## ネストされたコンポーネントテスト
609591
610592コンポーネントテンプレートには、多くの場合、ネストされたコンポーネントが含まれています。そのテンプレートには、さらに多くのコンポーネントが含まれている場合があります。
@@ -637,17 +619,15 @@ HELPFUL: 後のセクションでは、`createComponent()`メソッドと`page`
637619スタブセレクターは、対応する実際のコンポーネントのセレクターと一致します。
638620しかし、それらのテンプレートとクラスは空です。
639621
640- 次に、` TestBed ` 設定内で、実際にする必要があるコンポーネント、ディレクティブ、パイプの横に宣言します 。
622+ 次に、` TestBed.overrideComponent ` を使用してコンポーネントの ` imports ` をオーバーライドして宣言します 。
641623
642624<docs-code header =" app/app.component.spec.ts (TestBed stubs) " path =" adev/src/content/examples/testing/src/app/app.component.spec.ts " visibleRegion =" testbed-stubs " />
643625
644- ` AppComponent ` はテスト対象なので、当然、実際のバージョンを宣言します。
645-
646- 残りはスタブです。
626+ HELPFUL: この例の` set ` キーはコンポーネントの既存のimportsをすべて置き換えます。スタブだけでなく、すべての依存関係をimportするようにしてください。または、` remove ` /` add ` キーを使用してimportsを選択的に削除および追加できます。
647627
648628### ` NO_ERRORS_SCHEMA `
649629
650- 2番目の方法では、` TestBed.schemas ` メタデータに ` NO_ERRORS_SCHEMA ` を追加します。
630+ 2番目の方法では、コンポーネントのメタデータオーバーライドに ` NO_ERRORS_SCHEMA ` を追加します。
651631
652632<docs-code header =" app/app.component.spec.ts (NO_ERRORS_SCHEMA) " path =" adev/src/content/examples/testing/src/app/app.component.spec.ts " visibleRegion =" no-errors-schema " />
653633
@@ -732,155 +712,6 @@ Angularコンパイラーは、`<app-banner>`要素に対して`BannerStubCompon
732712
733713<docs-code header =" app/hero/hero-detail.component.spec.ts (selected tests) " path =" adev/src/content/examples/testing/src/app/hero/hero-detail.component.spec.ts " visibleRegion =" selected-tests " />
734714
735- ## ` compileComponents() ` の呼び出し
736-
737- HELPFUL: CLI` ng test ` コマンドでのみテストを実行している場合は、このセクションを無視してください。なぜなら、CLIはテストを実行する前にアプリケーションをコンパイルするからです。
738-
739- ** CLI以外の環境** でテストを実行する場合、テストは次のようなメッセージで失敗する可能性があります。
740-
741- <docs-code hideCopy language =" shell " >
742-
743- Error: This test module uses the component BannerComponent
744- which is using a "templateUrl" or "styleUrls", but they were never compiled.
745- Please call "TestBed.compileComponents" before your test.
746-
747- </docs-code >
748-
749- 問題の根本は、テストに関与するコンポーネントの少なくとも1つが、` BannerComponent ` の次のバージョンで行われているように、外部テンプレートまたはCSSファイルを指定していることです。
750-
751- <docs-code header =" app/banner/banner-external.component.ts (external template & css) " path =" adev/src/content/examples/testing/src/app/banner/banner-external.component.ts " />
752-
753- テストは、` TestBed ` がコンポーネントの作成を試みたときに失敗します。
754-
755- <docs-code avoid header =" app/banner/banner-external.component.spec.ts (setup that fails) " path =" adev/src/content/examples/testing/src/app/banner/banner-external.component.spec.ts " visibleRegion =" setup-may-fail " />
756-
757- アプリケーションはコンパイルされていないことを思い出してください。
758- そのため、` createComponent() ` を呼び出すと、` TestBed ` は暗黙的にコンパイルします。
759-
760- これは、ソースコードがメモリ内にある場合は問題ありません。
761- しかし、` BannerComponent ` は外部ファイルが必要であり、コンパイラーはファイルシステムからそれらを読み取る必要があります。これは本質的に* 非同期* 操作です。
762-
763- ` TestBed ` が続行することを許可すると、テストが実行され、コンパイラーが完了する前に、不可解な理由で失敗します。
764-
765- 予防的なエラーメッセージは、` compileComponents() ` で明示的にコンパイルするように指示しています。
766-
767- ### ` compileComponents() ` は非同期です
768-
769- ` compileComponents() ` は、非同期テスト関数内で呼び出す必要があります。
770-
771- CRITICAL: テスト関数を非同期にするのを怠ると(たとえば、[ waitForAsync()] ( #waitForAsync ) の使用を忘れると)、次のようなエラーメッセージが表示されます。
772-
773- <docs-code hideCopy language =" shell " >
774-
775- Error: ViewDestroyedError: Attempt to use a destroyed view
776-
777- </docs-code >
778-
779- 一般的なアプローチは、セットアップロジックを2つの別の` beforeEach() ` 関数に分割することです。
780-
781- | 関数 | 詳細 |
782- | :----------------------- | :---------------------------- |
783- | 非同期` beforeEach() ` | コンポーネントをコンパイルする |
784- | 同期` beforeEach() ` | 残りのセットアップを実行する |
785-
786- ### 非同期` beforeEach `
787-
788- 最初の非同期` beforeEach ` は、次のように記述します。
789-
790- <docs-code header =" app/banner/banner-external.component.spec.ts (async beforeEach) " path =" adev/src/content/examples/testing/src/app/banner/banner-external.component.spec.ts " visibleRegion =" async-before-each " />
791-
792- ` TestBed.configureTestingModule() ` メソッドは、` TestBed ` クラスを返し、` compileComponents() ` などの他の` TestBed ` の静的メソッドへの呼び出しをチェーンすることができます。
793-
794- この例では、` BannerComponent ` はコンパイルする必要がある唯一のコンポーネントです。
795- 他の例では、複数のコンポーネントでテストモジュールを設定し、さらに多くのコンポーネントを保持するアプリケーションモジュールをインポートする場合があります。
796- それらのいずれかが外部ファイルが必要になる可能性があります。
797-
798- ` TestBed.compileComponents ` メソッドは、テストモジュールで設定されたすべてのコンポーネントを非同期的にコンパイルします。
799-
800- IMPORTANT: ` compileComponents() ` を呼び出した後、` TestBed ` を再設定しないでください。
801-
802- ` compileComponents() ` を呼び出すと、現在の` TestBed ` インスタンスがさらに設定されなくなります。
803- ` configureTestingModule() ` や` override... ` メソッドなど、` TestBed ` の構成メソッドをさらに呼び出すことはできません。
804- ` TestBed ` は、試行するとエラーをスローします。
805-
806- ` compileComponents() ` を、` TestBed.createComponent() ` を呼び出す前の最後のステップにしてください。
807-
808- ### 同期` beforeEach `
809-
810- 2番目の、同期` beforeEach() ` には、残りのセットアップ手順が含まれます。これには、コンポーネントの作成と、検査する要素のクエリが含まれます。
811-
812- <docs-code header =" app/banner/banner-external.component.spec.ts (synchronous beforeEach) " path =" adev/src/content/examples/testing/src/app/banner/banner-external.component.spec.ts " visibleRegion =" sync-before-each " />
813-
814- テストランナーは、最初の非同期` beforeEach ` が終了するまで待ってから、2番目を呼び出します。
815-
816- ### 統合された設定
817-
818- 2つの` beforeEach() ` 関数を、1つの非同期` beforeEach() ` に統合できます。
819-
820- ` compileComponents() ` メソッドはプロミスを返すため、同期セットアップタスクを* コンパイル後* に実行することができます。そのため、同期コードを` await ` キーワードの後に移動します。この時点で、プロミスは解決されています。
821-
822- <docs-code header =" app/banner/banner-external.component.spec.ts (one beforeEach) " path =" adev/src/content/examples/testing/src/app/banner/banner-external.component.spec.ts " visibleRegion =" one-before-each " />
823-
824- ### ` compileComponents() ` は安全です
825-
826- ` compileComponents() ` を呼び出しても、必要ない場合でも害はありません。
827-
828- CLIによって生成されたコンポーネントテストファイルは、` ng test ` を実行しているときは不要ですが、` compileComponents() ` を呼び出します。
829-
830- このガイドのテストでは、必要に応じてのみ` compileComponents ` を呼び出します。
831-
832- ## モジュールインポートによるセットアップ
833-
834- 以前のコンポーネントテストでは、次のようにテストモジュールをいくつかの` declarations ` で設定していました。
835-
836- <docs-code header =" app/dashboard/dashboard-hero.component.spec.ts (configure TestBed) " path =" adev/src/content/examples/testing/src/app/dashboard/dashboard-hero.component.spec.ts " visibleRegion =" config-testbed " />
837-
838- ` DashboardComponent ` はシンプルです。
839- 助けは必要ありません。
840- しかし、より複雑なコンポーネントは、多くの場合、他のコンポーネント、ディレクティブ、パイプ、およびプロバイダーに依存しており、これらをテストモジュールにも追加する必要があります。
841-
842- 幸いなことに、` TestBed.configureTestingModule ` のパラメーターは、` @NgModule ` デコレーターに渡されるメタデータと並行しているため、` providers ` と` imports ` も指定できます。
843-
844- ` HeroDetailComponent ` は、小さいサイズでシンプルな構造にもかかわらず、多くの助けを必要としています。
845- デフォルトのテストモジュール` CommonModule ` からサポートを受けることに加えて、次のようなものが必要です。
846-
847- * ` FormsModule ` の` NgModel ` など、双方向データバインディングを有効にする
848- * ` shared ` フォルダの` TitleCasePipe `
849- * ルーターサービス
850- * ヒーローのデータアクセスサービス
851-
852- 1つのアプローチは、次の例のように、個々のピースからテストモジュールを設定することです。
853-
854- <docs-code header =" app/hero/hero-detail.component.spec.ts (FormsModule setup) " path =" adev/src/content/examples/testing/src/app/hero/hero-detail.component.spec.ts " visibleRegion =" setup-forms-module " />
855-
856- HELPFUL: ` beforeEach() ` が非同期であり、` TestBed.compileComponents ` を呼び出していることに注意してください。なぜなら、` HeroDetailComponent ` は外部テンプレートとcssファイルを持っているからです。
857-
858- [ compileComponentsの呼び出し] ( #calling-compilecomponents ) で説明されているように、これらのテストは、Angularがブラウザでそれらをコンパイルする必要がある、CLI以外の環境で実行することができます。
859-
860- ### 共有モジュールのインポート
861-
862- 多くのアプリケーションコンポーネントが` FormsModule ` と` TitleCasePipe ` を必要とするため、開発者は` SharedModule ` を作成して、これらと他の頻繁に要求される部分を組み合わせました。
863-
864- テスト設定では、次の例のように、` SharedModule ` も使用できます。
865-
866- <docs-code header =" app/hero/hero-detail.component.spec.ts (SharedModule setup) " path =" adev/src/content/examples/testing/src/app/hero/hero-detail.component.spec.ts " visibleRegion =" setup-shared-module " />
867-
868- これは少しタイトで小さく、インポートステートメントが少なくなります。この例では示されていません。
869-
870- ### 機能モジュールのインポート
871-
872- ` HeroDetailComponent ` は、` SharedModule ` など、相互依存する部分をさらにまとめた` HeroModule ` [ 機能モジュール] ( guide/ngmodules/feature-modules ) の一部です。
873- 次のような` HeroModule ` をインポートするテスト設定を試してみましょう。
874-
875- <docs-code header =" app/hero/hero-detail.component.spec.ts (HeroModule setup) " path =" adev/src/content/examples/testing/src/app/hero/hero-detail.component.spec.ts " visibleRegion =" setup-hero-module " />
876-
877- ` providers ` の* テストダブル* のみが残ります。
878- ` HeroDetailComponent ` の宣言でさえなくなっています。
879-
880- 実際、宣言しようとすると、Angularはエラーをスローします。なぜなら、` HeroDetailComponent ` は` HeroModule ` と` TestBed ` によって作成された` DynamicTestModule ` の両方で宣言されているからです。
881-
882- HELPFUL: コンポーネントの機能モジュールをインポートすると、モジュール内に多くの相互依存関係があり、モジュールが小さい場合(機能モジュールは通常小さい)にテストを設定する最良の方法になる場合があります。
883-
884715## コンポーネントプロバイダーのオーバーライド
885716
886717` HeroDetailComponent ` は独自の` HeroDetailService ` を提供します。
0 commit comments