API
Cette page a été traduite par PageTurner AI (bêta). Non approuvée officiellement par le projet. Vous avez trouvé une erreur ? Signaler un problème →
Angular Testing Library réexporte tous les éléments de DOM Testing Library ainsi que la méthode render.
Les réexportations suivantes ont été adaptées pour une utilisation simplifiée avec Angular :
Les événements de
fireEventdéclenchent automatiquement un cycle de détection des changements après l'émission de l'événementLes requêtes
findBydéclenchent automatiquement un cycle de détection des changements avant l'appel de la fonctionLes fonctions
waitFordéclenchent automatiquement un cycle de détection des changements avant d'invoquer la fonction de rappel
render
Avec Angular Testing Library, le composant peut être rendu de deux manières : via son type ou avec un template.
Par défaut,
renderimporte également leNoopAnimationsModule.
Type
Pour rendre un composant, vous devez passer son type à la méthode render. Pour les composants n'utilisant pas d'autres parties de votre application (comme des modules de design ou des services), le rendu peut être aussi simple que dans l'exemple suivant.
await render(AppComponent)
template
Au lieu de passer le type du composant comme premier argument, vous pouvez également fournir un template. Cette pratique est nécessaire pour rendre des directives, mais peut aussi s'appliquer aux composants, et peut même s'avérer plus utile. Le type de la directive (ou du composant) doit alors être ajouté aux imports (ou aux declarations pour les composants non autonomes).
exemple avec une directive :
await render('<div appSpoiler></div>', {
declarations: [SpoilerDirective],
})
exemple avec un composant :
await render(
'<app-component [value]="47" [otherValue]="anotherValue" (sendValue)="sendValue($event)"></app-component>',
{
declarations: [AppComponent],
componentProperties: {
anotherValue: 'valueOfAnotherProperty',
sendValue: jest.fn(),
},
},
)
export async function render<ComponentType>(
component: Type<ComponentType>,
renderOptions?: RenderComponentOptions<ComponentType>,
): Promise<RenderResult<ComponentType, ComponentType>>
export async function render<WrapperType = WrapperComponent>(
template: string,
renderOptions?: RenderTemplateOptions<WrapperType>,
): Promise<RenderResult<WrapperType>>
Options de rendu des composants
inputs
Un objet pour définir les propriétés @Input ou input() du composant.
valeur par défaut : {}
await render(AppComponent, {
inputs: {
counterValue: 10,
// explicitly define aliases using `aliasedInput`
...aliasedInput('someAlias', 'someValue'),
},
})
on
Un objet contenant des fonctions de rappel pour s'abonner aux EventEmitters et Observables du composant.
valeur par défaut : {}
// using a manual callback
const sendValue = (value) => { ... }
await render(AppComponent, {
on: {
send: (value) => sendValue(value),
}
})
// using a (jest) spy
const sendValueSpy = jest.fn()
await render(AppComponent, {
on: {
send: sendValueSpy
}
})
bindings
Un tableau de liaisons à appliquer au composant via l'API native de liaisons d'Angular. Cette approche offre un moyen plus direct de lier les entrées et sorties comparé aux options inputs et on. L'API de liaisons utilise les fonctions inputBinding, outputBinding et twoWayBinding de @angular/core.
Par défaut : []
import { inputBinding, outputBinding, twoWayBinding, signal } from '@angular/core'
await render(AppComponent, {
bindings: [
// Bind a static input value
inputBinding('greeting', () => 'Hello'),
// Bind a signal as an input
inputBinding('age', () => 25),
// Two-way binding with a signal
twoWayBinding('name', signal('John')),
// Output binding with a callback
outputBinding('submitValue', (event) => console.log(event)),
],
})
Utilisation des signaux pour des mises à jour réactives :
const greetingSignal = signal('Good day')
const nameSignal = signal('David')
const ageSignal = signal(35)
const { fixture } = await render(AppComponent, {
bindings: [
inputBinding('greeting', greetingSignal),
inputBinding('age', ageSignal),
twoWayBinding('name', nameSignal),
],
})
// Update signals externally
greetingSignal.set('Good evening')
Gestion des sorties :
const submitHandler = jest.fn()
await render(AppComponent, {
bindings: [
outputBinding('submit', submitHandler),
],
})
declarations
Un ensemble de composants, directives et pipes nécessaires au rendu du composant. Par exemple, les composants imbriqués.
Pour plus d'informations, consultez la documentation Angular.
Par défaut : []
exemple:
await render(AppComponent, {
declarations: [CustomerDetailComponent, ButtonComponent],
})
deferBlockBehavior
Définit le comportement des blocs différés.
Pour plus d'informations, consultez la documentation Angular.
valeur par défaut : undefined (utilise DeferBlockBehavior.Manual, ce qui diffère du comportement Angular par défaut DeferBlockBehavior.Playthrough)
exemple:
await render(AppComponent, {
deferBlockBehavior: DeferBlockBehavior.Playthrough,
})
deferBlockStates
Définit l'état initial des blocs différés dans un composant.
Pour plus d'informations, consultez la documentation Angular.
valeur par défaut : undefined (utilise le comportement Angular par défaut : DeferBlockState.Placeholder)
exemple:
await render(FixtureComponent, {
deferBlockStates: DeferBlockState.Loading,
})
componentProviders
Collection de fournisseurs nécessaires au rendu du composant via l'injection de dépendances.
Ils seront fournis au niveau du composant. Pour injecter des dépendances au niveau du module, utilisez providers.
Pour plus d'informations, consultez la documentation Angular.
Par défaut : []
exemple:
await render(AppComponent, {
componentProviders: [AppComponentService],
})
componentImports
Collection d'imports pour remplacer les imports d'un composant autonome.
Par défaut : undefined
exemple:
await render(AppComponent, {
componentImports: [MockChildComponent],
})
childComponentOverrides
Collection de fournisseurs spécifiques à des composants enfants à remplacer.
Par défaut : undefined
exemple:
await render(AppComponent, {
childComponentOverrides: [
{
component: ChildOfAppComponent,
providers: [{provide: ChildService, useValue: {hello: 'world'}}],
},
],
})
detectChangesOnRender
Invoque detectChanges après le rendu du composant.
Par défaut : true
exemple:
await render(AppComponent, {detectChangesOnRender: false})
autoDetectChanges
Détecte automatiquement les changements comme le ferait un composant en fonctionnement réel. Par exemple, déclenche un cycle de détection des changements après un événement.
Par défaut : true
exemple:
await render(AppComponent, {
autoDetectChanges: false,
})
excludeComponentDeclaration
Exclut le composant de la déclaration automatique. Nécessaire lorsque le composant est déclaré dans un module importé, par exemple avec les SCAM.
Par défaut : false
exemple:
await render(AppComponent, {
imports: [AppModule], // a module that includes AppComponent
excludeComponentDeclaration: true,
})
imports
Collection d'imports nécessaires au rendu du composant (ex: modules partagés). Ajoute NoopAnimationsModule par défaut si BrowserAnimationsModule n'est pas inclus.
Pour plus d'informations, consultez la documentation Angular.
Par défaut : [NoopAnimationsModule]
exemple:
await render(AppComponent, {
imports: [AppSharedModule, MaterialModule],
})
providers
Collection de fournisseurs nécessaires au rendu du composant via l'injection de dépendances.
Ils seront fournis au niveau du module. Pour injecter des dépendances au niveau du composant, utilisez componentProviders.
Pour plus d'informations, consultez la documentation Angular.
Par défaut : []
exemple:
await render(AppComponent, {
providers: [
CustomersService,
{
provide: MAX_CUSTOMERS_TOKEN,
useValue: 10,
},
],
})
queries
Requêtes à lier. Remplace l'ensemble par défaut de DOM Testing Library sauf fusion.
Par défaut : undefined
exemple:
await render(AppComponent, {
queries: {...queries, ...customQueries},
})
routes
La configuration de route pour paramétrer le service de routeur via RouterTestingModule.withRoutes. Pour plus d'informations, consultez la documentation sur les routes Angular.
Par défaut : []
exemple:
await render(AppComponent, {
declarations: [ChildComponent],
routes: [
{
path: '',
children: [
{
path: 'child/:id',
component: ChildComponent,
},
],
},
],
})
schemas
Collection de schémas nécessaires au rendu du composant. Valeurs autorisées : NO_ERRORS_SCHEMA et CUSTOM_ELEMENTS_SCHEMA.
Pour plus d'informations, consultez la documentation Angular.
Par défaut : []
exemple:
await render(AppComponent, {
schemas: [NO_ERRORS_SCHEMA],
})
removeAngularAttributes
Supprime les attributs Angular (ng-version et root-id) du fixture.
Par défaut : false
exemple:
await render(AppComponent, {
removeAngularAttributes: true,
})
componentInputs (obsolète)
componentInputsObjet pour définir les propriétés @Input du composant. Utilise setInput pour définir la propriété. Lance une erreur si la propriété du composant n'est pas annotée avec l'attribut @Input.
valeur par défaut : {}
exemple:
await render(AppComponent, {
componentInputs: {
counterValue: 10,
},
})
componentOutputs (obsolète)
componentOutputsUn objet pour définir les propriétés @Output du composant.
valeur par défaut : {}
exemple:
await render(AppComponent, {
componentOutputs: {
clicked: (value) => { ... }
}
})
componentProperties (obsolète)
componentPropertiesUn objet pour définir les propriétés @Input et @Output du composant. Ne permet
pas un contrôle aussi précis que inputs et on.
valeur par défaut : {}
exemple:
await render(AppComponent, {
componentProperties: {
// an input
counterValue: 10,
// an output
send: (value) => { ... }
// a public property
name: 'Tim'
}
})
RenderResult
container
Le nœud DOM contenant votre composant Angular rendu. Il s'agit d'un nœud DOM
standard, vous pouvez donc utiliser container.querySelector etc. pour inspecter
les éléments enfants.
debug
Affiche le DOM du composant avec coloration syntaxique. Accepte un paramètre optionnel pour afficher un nœud DOM spécifique.
const {debug} = await render(AppComponent)
debug()
rerender
Modifie les propriétés d'entrée de l'instance existante du composant en suivant
le cycle de vie Angular (i.e. ngOnChanges est appelé). Les propriétés non
définies sont réinitialisées.
const {rerender} = await render(Counter, {
inputs: {count: 4, name: 'Sarah'},
})
expect(screen.getByTestId('count-value').textContent).toBe('4')
expect(screen.getByTestId('name-value').textContent).toBe('Sarah')
await rerender({
inputs: {count: 7}
})
// count is updated to 7
expect(screen.getByTestId('count-value').textContent).toBe('7')
// name is undefined because it's not provided in rerender
expect(screen.getByTestId('name-value').textContent).toBeUndefined()
Avec partialUpdate, seules les nouvelles propriétés fournies seront mises à jour.
Les autres propriétés d'entrée non fournies ne seront pas réinitialisées.
const {rerender} = await render(Counter, {
inputs: {count: 4, name: 'Sarah'},
})
expect(screen.getByTestId('count-value').textContent).toBe('4')
expect(screen.getByTestId('name-value').textContent).toBe('Sarah')
await rerender({inputs: {count: 7}, partialUpdate: true})
// count is updated to 7
expect(screen.getByTestId('count-value').textContent).toBe('7')
// name is still rendered as "Sarah" because of the partial update
expect(screen.getByTestId('name-value').textContent).toBe('Sarah')
detectChanges
Déclenche un cycle de détection de changement pour le composant.
Pour plus d'informations, consultez la documentation Angular.
debugElement
Le DebugElement Angular du composant.
Pour plus d'informations, consultez la documentation Angular.
fixture
Le ComponentFixture Angular du composant.
Pour plus d'informations, consultez la documentation Angular.
const {fixture} = await render(AppComponent)
// componentInstance is typed as AppComponent
const componentInstance = fixture.componentInstance
🚨 Si vous utilisez
fixturepour accéder aux valeurs internes du composant, reconsidérez votre approche ! Cela signifie probablement que vous testez des détails d'implémentation.
navigate
Accepte un élément DOM ou un chemin comme paramètre. Si un élément est passé,
navigate accédera à la valeur href de l'élément. Si un chemin est passé,
navigate accédera directement au chemin.
const { navigate } = await render(AppComponent, {
routes: [...]
})
await navigate(component.getByLabelText('To details'))
await navigate('details/3')
...queries
La fonctionnalité principale de render est que les requêtes de la
DOM Testing Library sont automatiquement
retournées avec leur premier argument lié au composant testé.
Voir Requêtes pour une liste complète.
exemple:
const {getByText, queryByLabelText} = await render(AppComponent)
screen.getByRole('heading', {
name: /api/i,
})
queryByLabelText(/First name/i')
renderDeferBlock
Pour tester les vues différées, vous pouvez utiliser renderDeferBlock. renderDeferBlock définit l'état différé souhaité pour un bloc spécifique. L'état initial par défaut est Placeholder, mais vous pouvez aussi définir l'état initial lors du rendu du composant.
const {renderDeferBlock} = await render(FixtureComponent, {
deferBlockStates: DeferBlockState.Loading,
})
expect(screen.getByText(/loading/i)).toBeInTheDocument()
await renderDeferBlock(DeferBlockState.Complete)
expect(screen.getByText(/completed/i)).toBeInTheDocument()