始める前に
TIP: このガイドは、すでにコンポーネントハーネスの概要ガイドを読んでいることを前提としています。コンポーネントハーネスの使用が初めての場合は、まずそちらをお読みください。
テスト環境のサポートを追加するのはどのような場合ですか?
以下の環境でコンポーネントハーネスを使用するには、Angular CDKの2つの組み込み環境を使用できます。
- 単体テスト
- WebDriverエンドツーエンドテスト
サポートされているテスト環境を使用するには、コンポーネントのハーネスを作成するガイドをお読みください。
それ以外の場合、他の環境のサポートを追加するには、DOM要素との対話方法と、その環境でDOMの対話がどのように機能するかを定義する必要があります。詳細については、引き続きお読みください。
CDKのインストール
Component Dev Kit (CDK)は、コンポーネントを構築するための動作プリミティブのセットです。コンポーネントハーネスを使用するには、まずnpmから@angular/cdk
をインストールします。これは、Angular CLIを使用してターミナルから実行できます。
ng add @angular/cdk
TestElement実装の作成 {#creating-a-testelement-implementation}
すべてのテスト環境はTestElement
実装を定義する必要があります。TestElement
インターフェースは、DOM要素の環境に依存しない表現の役割を果たします。これにより、ハーネスは基盤となる環境に関係なくDOM要素と対話できます。一部の環境ではDOM要素との同期的な対話がサポートされていないため(例: WebDriver)、すべてのTestElement
メソッドは非同期であり、操作の結果をPromise
で返します。
TestElement
は、blur()
、click()
、getAttribute()
など、基盤であるDOMと対話するための多数のメソッドを提供します。メソッドの完全なリストについては、TestElement APIリファレンスページを参照してください。
TestElement
インターフェースは、主にHTMLElement
で利用可能なメソッドに似たメソッドで構成されています。ほとんどのテスト環境には同様のメソッドが存在するため、それらのメソッドの実装は非常に簡単です。ただし、sendKeys
メソッドを実装する際に注意すべき重要な違いは、TestKey
enumのキーコードがテスト環境で使用されるキーコードと異なる可能性があることです。環境の作成者は、TestKey
コードから特定のテスト環境で使用されるコードへのマッピングを維持する必要があります。
Angular CDKのUnitTestElementとSeleniumWebDriverElementの実装は、このインターフェースの実装の良い例として機能します。
HarnessEnvironment
の実装を作成する
テスト作成者は、テストで使用するコンポーネントハーネスインスタンスを作成するためにHarnessEnvironment
を使用します。HarnessEnvironment
は、新しい環境のための具象サブクラスを作成するために拡張されなければならない抽象クラスです。新しいテスト環境をサポートする場合、すべての抽象メンバーに具象実装を追加するHarnessEnvironment
サブクラスを作成します。
HarnessEnvironment
にはジェネリック型パラメータHarnessEnvironment<E>
があります。このパラメータE
は、環境の生要素型を表します。例えば、このパラメータは単体テスト環境ではElement
です。
以下は、実装する必要がある抽象メソッドです。
Method | Description |
---|---|
abstract getDocumentRoot(): E |
環境のルート要素(例: document.body )を取得します。 |
abstract createTestElement(element: E): TestElement |
指定された生要素のTestElement を作成します。 |
abstract createEnvironment(element: E): HarnessEnvironment |
指定された生要素をルートとするHarnessEnvironment を作成します。 |
abstract getAllRawElements(selector: string): Promise<E[]> |
環境のルート要素の下にある、指定されたセレクターに一致するすべての生要素を取得します。 |
abstract forceStabilize(): Promise<void> |
NgZone が安定したときに解決するPromise を取得します。さらに、該当する場合、NgZone に安定化を指示します(例: fakeAsync テストでflush() を呼び出す)。 |
abstract waitForTasksOutsideAngular(): Promise<void> |
NgZone の親ゾーンが安定したときに解決するPromise を取得します。 |
欠落しているメソッドを実装することに加えて、このクラスはテスト作成者がComponentHarness
インスタンスを取得する方法を提供する必要があります。保護されたコンストラクターを定義し、HarnessLoader
インスタンスを返すloader
という静的メソッドを提供する必要があります。これにより、テスト作成者はSomeHarnessEnvironment.loader().getHarness(...)
のようなコードを記述できます。特定の環境のニーズに応じて、クラスはいくつかの異なる静的メソッドを提供したり、引数を渡すことを要求したりする場合があります。(例: TestbedHarnessEnvironment
のloader
メソッドはComponentFixture
を取り、クラスはdocumentRootLoader
とharnessForFixture
という追加の静的メソッドを提供します)。
Angular CDKのTestbedHarnessEnvironment
とSeleniumWebDriverHarnessEnvironmentの実装は、このインターフェースの実装の良い例として役立ちます。
自動での変更検知のハンドリング
manualChangeDetection
と並列APIをサポートするために、お使いの環境は自動での変更検知ステータス用のハンドラーをインストールする必要があります。
お使いの環境が自動での変更検知ステータスのハンドリングを開始したい場合、handleAutoChangeDetectionStatus(handler)
を呼び出すことができます。ハンドラー関数は、isDisabled
とonDetectChangesNow()
の2つのプロパティを持つAutoChangeDetectionStatus
を受け取ります。詳細については、AutoChangeDetectionStatus APIリファレンスページを参照してください。
お使いの環境が自動での変更検知ステータスのハンドリングを停止したい場合、stopHandlingAutoChangeDetectionStatus()
を呼び出すことができます。