Spec-Zone.ru › Angular

Вспомогательные API для тестирования

ПРИМЕЧАНИЕ: Пока это руководство обновляется для Vitest, некоторые описания и примеры вспомогательных API приводятся в контексте Karma/Jasmine. Мы активно работаем над тем, чтобы предоставить эквиваленты для Vitest и обновить рекомендации там, где это применимо.

На этой странице описаны наиболее полезные возможности Angular для тестирования.

Вспомогательные средства Angular для тестирования включают TestBed, ComponentFixture и несколько функций, управляющих тестовой средой. Классы TestBed и ComponentFixture рассматриваются отдельно.

Ниже приведён краткий обзор отдельных функций, расположенных в порядке их предполагаемой полезности:

Функция Подробности
[inject] Внедряет одну или несколько служб из инжектора текущего TestBed в тестовую функцию. Эта функция не может внедрить службу, предоставляемую самим компонентом. См. обсуждение debugElement.injector.
getTestBed Возвращает текущий экземпляр TestBed. Обычно в этом нет необходимости, поскольку статических методов класса TestBed, как правило, достаточно. Экземпляр TestBed предоставляет несколько редко используемых членов, недоступных в виде статических методов.

Сведения об обработке сложных асинхронных сценариев и тестировании устаревших приложений на основе Zone.js см. в руководстве Вспомогательные средства тестирования Zone.js.

Краткое описание класса TestBed

Класс TestBed — одно из основных вспомогательных средств Angular для тестирования. Его API довольно обширен и может показаться сложным, пока вы не изучите его понемногу. Сначала прочитайте начало этого руководства, чтобы освоить основы, и только потом переходите к изучению всего API.

Определение модуля, передаваемое в configureTestingModule, представляет собой подмножество свойств метаданных @NgModule.

type TestModuleMetadata = {
  providers?: any[];
  declarations?: any[];
  imports?: any[];
  schemas?: Array<SchemaMetadata | any[]>;
};

Каждый метод переопределения принимает MetadataOverride<T>, где T — тип метаданных, соответствующий методу, то есть параметр @NgModule, @Component, @Directive или @Pipe.

type MetadataOverride<T> = {
  add?: Partial<T>;
  remove?: Partial<T>;
  set?: Partial<T>;
};

API TestBed состоит из статических методов класса, которые обновляют или используют глобальный экземпляр TestBed.

Внутри все статические методы охватывают методы текущего экземпляра TestBed во время выполнения; этот экземпляр также возвращается функцией getTestBed().

Вызывайте методы TestBed внутри beforeEach(), чтобы каждый отдельный тест начинался с чистого состояния.

Ниже приведены наиболее важные статические методы, расположенные в порядке их предполагаемой полезности.

Методы Подробности
configureTestingModule Вспомогательные средства тестирования настраивают начальную тестовую среду и модуль тестирования по умолчанию. Модуль тестирования по умолчанию настроен с базовыми декларациями и некоторыми заменами служб Angular, которые нужны каждому специалисту по тестированию.
Вызовите configureTestingModule, чтобы уточнить конфигурацию модуля тестирования для конкретного набора тестов, добавив или удалив импорты, объявления (компонентов, директив и каналов) и поставщиков.
compileComponents Асинхронно скомпилируйте модуль тестирования после завершения его настройки. Вы обязаны вызвать этот метод, если какие-либо компоненты модуля тестирования содержат асинхронно загружаемые ресурсы (например, блоки @defer).
После вызова compileComponents конфигурация TestBed замораживается на время текущей спецификации.
createComponent<T> Создайте экземпляр компонента типа T на основе текущей конфигурации TestBed. После вызова createComponent конфигурация TestBed замораживается на время текущей спецификации.
overrideComponent Заменяет метаданные указанного класса компонента, который может быть глубоко вложен во внутренний модуль.
overrideDirective Заменяет метаданные указанного класса директивы, который может быть глубоко вложен во внутренний модуль.
overridePipe Заменяет метаданные указанного класса канала, который может быть глубоко вложен во внутренний модуль.
overrideModule Заменяет метаданные указанного NgModule. Помните, что модули могут импортировать другие модули. Метод overrideModule может обратиться к глубоко вложенному модулю текущего тестового модуля и изменить его.

| inject | Получает службу из инжектора текущего TestBed. Для этой цели часто достаточно функции inject. Но inject выдаёт ошибку, если не может предоставить службу.
Что делать, если служба необязательна?
Метод TestBed.inject() принимает необязательный второй параметр — объект, который нужно вернуть, если Angular не найдёт поставщика (в этом примере это null): expect(TestBed.inject(NotProvided, null)).toBeNull(); После вызова TestBed.inject конфигурация TestBed замораживается на время текущей спецификации. | | initTestEnvironment | Инициализирует тестовую среду для всего запуска тестов.
Вспомогательные средства тестирования вызывают этот метод за вас, поэтому обычно нет необходимости вызывать его самостоятельно.
Вызывайте этот метод ровно один раз. Чтобы изменить это значение по умолчанию в ходе запуска тестов, сначала вызовите resetTestEnvironment.
Укажите фабрику компилятора Angular, PlatformRef и модуль тестирования Angular по умолчанию. Варианты для небраузерных платформ доступны в общей форме @angular/platform-<platform_name>/testing/<platform_name>. | | resetTestEnvironment | Сбрасывает начальную тестовую среду, включая модуль тестирования по умолчанию. |

Некоторые методы экземпляра TestBed не охватываются статическими методами класса TestBed. Они нужны редко.

ComponentFixture

TestBed.createComponent<T> создаёт экземпляр компонента T и возвращает типизированный объект ComponentFixture для этого компонента.

Свойства и методы ComponentFixture обеспечивают доступ к компоненту, его представлению в DOM и различным аспектам его среды Angular.

Свойства ComponentFixture

Ниже приведены наиболее важные для тестирования свойства, расположенные в порядке их предполагаемой полезности.

Свойства Подробности
componentInstance Экземпляр класса компонента, созданный методом TestBed.createComponent.
debugElement DebugElement, связанный с корневым элементом компонента.
Объект debugElement позволяет изучать компонент и его элемент DOM во время тестирования и отладки. Это важное свойство для тестирования. Самые интересные члены описаны ниже.
nativeElement Нативный элемент DOM в корне компонента.
changeDetectorRef ChangeDetectorRef компонента.
ChangeDetectorRef особенно полезен при тестировании компонента с методом ChangeDetectionStrategy.OnPush или когда обнаружение изменений компонента контролируется программно.

Методы ComponentFixture

Методы fixture заставляют Angular выполнять определённые действия над деревом компонентов. Вызывайте эти методы, чтобы запускать поведение Angular в ответ на имитацию действий пользователя.

Ниже приведены наиболее полезные методы для тестирования.

Методы Подробности
detectChanges Запускает цикл обнаружения изменений для компонента.
Вызовите этот метод, чтобы инициализировать компонент (он вызывает ngOnInit), а также после того, как код теста изменит значения свойств компонента, связанных с данными. Angular не может определить, что вы изменили personComponent.name, и не обновит привязку name, пока вы не вызовете detectChanges.
После этого запускает checkNoChanges, чтобы убедиться в отсутствии циклических обновлений, кроме случаев вызова как detectChanges(false);
autoDetectChanges Установите значение true, если хотите, чтобы fixture автоматически обнаруживал изменения.
Если параметр автоматического обнаружения имеет значение true, тестовая fixture вызывает detectChanges сразу после создания компонента. Затем она отслеживает соответствующие события зоны и при необходимости вызывает detectChanges. Если тестовый код напрямую изменяет значения свойств компонента, возможно, всё равно потребуется вызвать fixture.detectChanges, чтобы запустить обновление привязок данных.
По умолчанию используется значение false. Специалисты по тестированию, предпочитающие точно контролировать поведение тестов, обычно оставляют значение false.
checkNoChanges Запускает обнаружение изменений, чтобы убедиться в отсутствии ожидающих обработки изменений. Если они есть, выдаёт исключение.
isStable Если fixture в данный момент стабильна, возвращает true. Если остались незавершённые асинхронные задачи, возвращает false.
whenStable Возвращает обещание, которое разрешается, когда fixture становится стабильной.
Чтобы возобновить тестирование после завершения асинхронной активности или асинхронного обнаружения изменений, добавьте обработчик к этому обещанию. См. раздел whenStable.
destroy Запускает уничтожение компонента.

DebugElement

DebugElement позволяет получить важные сведения о представлении DOM компонента.

Начиная с корневого компонента теста, объект DebugElement которого возвращается вызовом fixture.debugElement, можно пройти по всему дереву элементов и компонентов fixture и выполнять по нему запросы.

Ниже приведены наиболее полезные для тестирования члены DebugElement, расположенные примерно в порядке их полезности:

Члены Подробности
nativeElement Соответствующий элемент DOM в браузере
query Вызов query(predicate: Predicate<DebugElement>) возвращает первый DebugElement на любой глубине поддерева, соответствующий предикату.
queryAll Вызов queryAll(predicate: Predicate<DebugElement>) возвращает все DebugElements на любой глубине поддерева, соответствующие предикату.
injector Инжектор зависимостей родительского элемента. Например, инжектор экземпляра компонента корневого элемента.
componentInstance Собственный экземпляр компонента элемента, если он есть.
context Объект, предоставляющий контекст родительского элемента для этого элемента. Часто это экземпляр компонента-предка, управляющего данным элементом.
Если элемент повторяется внутри блока @for, контекстом является RepeaterContext, свойство $implicit которого содержит значение строки. Например, hero в @for(hero of heroes; ...).
children Непосредственные дочерние элементы DebugElement. Перемещайтесь по дереву, переходя к дочерним элементам через children. У DebugElement также есть childNodes — список объектов DebugNode. DebugElement наследуется от объектов DebugNode, поэтому узлов часто больше, чем элементов. Специалисты по тестированию обычно могут не учитывать обычные узлы.
parent Родительский элемент DebugElement. Равен Null, если это корневой элемент.
name Имя тега элемента, если это элемент.
triggerEventHandler Вызывает событие с указанным именем, если в коллекции listeners элемента есть соответствующий обработчик. Второй параметр — это объект события, ожидаемый обработчиком.
Если для события нет обработчика или возникла другая проблема, попробуйте вызвать nativeElement.dispatchEvent(eventObject).
listeners Функции обратного вызова, связанные со свойствами @Output компонента и/или свойствами событий элемента.
providerTokens Токены для поиска через инжектор этого компонента. Включает сам компонент и токены, перечисленные в его метаданных providers.
source Положение этого элемента в шаблоне исходного компонента.
references Словарь объектов, связанных с локальными переменными шаблона (например, #foo), где ключом служит имя локальной переменной.

Методы DebugElement.query(predicate) и DebugElement.queryAll(predicate) принимают предикат, который фильтрует поддерево исходного элемента и находит соответствующие объекты DebugElement.

Предикат — это любой метод, который принимает DebugElement и возвращает истинное значение. В следующем примере находятся все DebugElements со ссылкой на локальную переменную шаблона с именем "content":

// Filter for DebugElements with a #content reference
const contentRefs = el.queryAll((de) => de.references['content']);

Класс Angular By содержит три статических метода для часто используемых предикатов:

Статический метод Подробности
By.all Возвращает все элементы
By.css(selector) Возвращает элементы, соответствующие CSS-селекторам
By.directive(directive) Возвращает элементы, для которых Angular сопоставил экземпляр класса директивы
// Can find DebugElement either by css selector or by directive
const h2 = fixture.debugElement.query(By.css('h2'));
const directive = fixture.debugElement.query(By.directive(Highlight));

Super-powered by Google ©2010–2025.
Code licensed under an MIT-style License. Documentation licensed under CC BY 4.0.
https://angular.dev/guide/testing/utility-apis

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API