Перед началом работы
СОВЕТ: Это руководство предполагает, что вы уже ознакомились с обзором component harnesses. Прочитайте его в первую очередь, если вы новичок в использовании harness для компонентов.
Когда имеет смысл добавлять поддержку среды тестирования?
Чтобы использовать component harnesses в следующих средах, вы можете воспользоваться двумя встроенными средами Angular CDK:
- Юнит-тесты (Unit tests)
- Сквозные (E2E) тесты WebDriver
Чтобы использовать поддерживаемую среду тестирования, ознакомьтесь с руководством Создание harness для ваших компонентов.
В противном случае, чтобы добавить поддержку других сред, необходимо определить способы взаимодействия с DOM-элементом и то, как эти взаимодействия работают в вашей среде. Продолжайте чтение, чтобы узнать больше.
Установка CDK
Component Dev Kit (CDK) — это набор поведенческих примитивов для создания
компонентов. Чтобы использовать component harnesses, сначала установите @angular/cdk из npm. Вы можете сделать это
через терминал, используя Angular CLI:
ng add @angular/cdk
Создание реализации TestElement
Каждая среда тестирования должна определять реализацию TestElement. Интерфейс TestElement служит независимым от
среды представлением DOM-элемента. Это позволяет harness взаимодействовать с DOM-элементами независимо от используемой
среды. Поскольку некоторые среды не поддерживают синхронное взаимодействие с DOM-элементами (например, WebDriver), все
методы TestElement являются асинхронными и возвращают Promise с результатом операции.
TestElement предлагает ряд методов для взаимодействия с базовым DOM, таких как blur(), click(), getAttribute() и
другие. Полный список методов см. на странице справочника API TestElement.
Интерфейс TestElement в основном состоит из методов, напоминающих методы, доступные в HTMLElement. Подобные методы
существуют в большинстве сред тестирования, что делает их реализацию довольно простой. Однако важное отличие, которое
следует учитывать при реализации метода sendKeys, заключается в том, что коды клавиш в перечислении TestKey,
вероятно, отличаются от кодов клавиш, используемых в среде тестирования. Авторы сред должны поддерживать сопоставление (
маппинг) кодов TestKey с кодами, используемыми в конкретной среде тестирования.
Реализации UnitTestElement и SeleniumWebDriverElement в Angular CDK служат хорошими примерами реализации этого интерфейса.
Создание реализации HarnessEnvironment
Авторы тестов используют HarnessEnvironment для создания экземпляров component harness для использования в тестах.
HarnessEnvironment — это абстрактный класс, который необходимо расширить для создания конкретного подкласса для новой
среды. При добавлении поддержки новой среды тестирования создайте подкласс HarnessEnvironment, который добавляет
конкретные реализации для всех абстрактных членов.
HarnessEnvironment имеет параметр универсального типа (generic): HarnessEnvironment<E>. Этот параметр, E,
представляет собой тип исходного (raw) элемента среды. Например, для сред юнит-тестирования этим параметром является
Element.
Ниже приведены абстрактные методы, которые необходимо реализовать:
| Метод | Описание |
|---|---|
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> |
Возвращает Promise, который разрешается, когда NgZone становится стабильной. Кроме того, если применимо, дает команду NgZone стабилизироваться (например, вызывая flush() в тесте fakeAsync). |
abstract waitForTasksOutsideAngular(): Promise<void> |
Возвращает Promise, который разрешается, когда родительская зона NgZone становится стабильной. |
Помимо реализации недостающих методов, этот класс должен предоставлять авторам тестов способ получения экземпляров
ComponentHarness. Следует определить защищенный (protected) конструктор и предоставить статический метод loader,
возвращающий экземпляр HarnessLoader. Это позволяет авторам тестов писать код вида:
SomeHarnessEnvironment.loader().getHarness(...). В зависимости от потребностей конкретной среды, класс может
предоставлять несколько различных статических методов или требовать передачи аргументов (например, метод loader в
TestbedHarnessEnvironment принимает ComponentFixture, а класс предоставляет дополнительные статические методы
documentRootLoader и harnessForFixture).
Реализации TestbedHarnessEnvironment
и SeleniumWebDriverHarnessEnvironment в
Angular CDK служат хорошими примерами реализации этого интерфейса.
Обработка автоматического обнаружения изменений
Для поддержки manualChangeDetection и параллельных API ваша среда должна установить обработчик статуса автоматического
обнаружения изменений.
Когда ваша среда хочет начать обработку статуса автоматического обнаружения изменений, она может вызвать
handleAutoChangeDetectionStatus(handler). Функция-обработчик получит AutoChangeDetectionStatus, который имеет два
свойства: isDisabled и onDetectChangesNow(). Дополнительную информацию см.
на странице справочника API AutoChangeDetectionStatus.
Если ваша среда хочет прекратить обработку статуса автоматического обнаружения изменений, она может вызвать
stopHandlingAutoChangeDetectionStatus().