API
Esta página foi traduzida por PageTurner AI (beta). Não é oficialmente endossada pelo projeto. Encontrou um erro? Reportar problema →
A Angular Testing Library reexporta tudo da DOM Testing Library junto com o método render.
As seguintes reexportações são adaptadas para facilitar o uso com Angular:
Os eventos no
fireEventautomaticamente disparam um ciclo de detecção de mudanças após o evento ser executadoAs queries
findByautomaticamente disparam um ciclo de detecção de mudanças antes da função de query ser invocadaAs funções
waitForautomaticamente disparam um ciclo de detecção de mudanças antes de invocar a função callback
render
Com a Angular Testing Library, o componente pode ser renderizado de duas formas: via tipo do componente ou com um template.
Por padrão,
rendertambém importa oNoopAnimationsModule.
Type
Para renderizar um componente, você precisa passar seu tipo para o método render. Para componentes que não usam outras partes da aplicação (como módulos de design ou serviços), a renderização pode ser simples como no exemplo:
await render(AppComponent)
template
Em vez de passar o tipo do componente como primeiro argumento, você pode fornecer um template. Essa abordagem é obrigatória para renderizar diretivas mas também pode ser aplicada a componentes, sendo até mais útil. O tipo da diretiva (ou componente) deve então ser adicionado aos imports (ou declarations para componentes não standalone).
exemplo com diretiva:
await render('<div appSpoiler></div>', {
declarations: [SpoilerDirective],
})
exemplo com componente:
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>>
Component RenderOptions
inputs
Um objeto para definir propriedades @Input ou input() do componente.
padrão : {}
await render(AppComponent, {
inputs: {
counterValue: 10,
// explicitly define aliases using `aliasedInput`
...aliasedInput('someAlias', 'someValue'),
},
})
on
Um objeto com callbacks para inscrever-se em EventEmitters e Observables do componente.
padrão : {}
// 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
Um array de bindings para aplicar ao componente usando a API nativa de bindings do Angular. Essa abordagem oferece uma forma mais direta de vincular inputs e outputs comparada às opções inputs e on. A API de bindings utiliza as funções inputBinding, outputBinding e twoWayBinding do @angular/core.
padrão: []
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)),
],
})
Usando signals para atualizações reativas:
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')
Tratando outputs:
const submitHandler = jest.fn()
await render(AppComponent, {
bindings: [
outputBinding('submit', submitHandler),
],
})
declarations
Coleção de componentes, diretivas e pipes necessários para renderizar o componente, como componentes aninhados.
Para mais informações, consulte a documentação do Angular.
padrão: []
exemplo:
await render(AppComponent, {
declarations: [CustomerDetailComponent, ButtonComponent],
})
deferBlockBehavior
Define o comportamento dos blocos defer.
Para mais informações, consulte a documentação do Angular
padrão : undefined (usa DeferBlockBehavior.Manual, que difere do padrão do Angular DeferBlockBehavior.Playthrough)
exemplo:
await render(AppComponent, {
deferBlockBehavior: DeferBlockBehavior.Playthrough,
})
deferBlockStates
Define o estado inicial de blocos deferíveis em um componente.
Para mais informações, consulte a documentação do Angular
padrão : undefined (usa o padrão do Angular, DeferBlockState.Placeholder)
exemplo:
await render(FixtureComponent, {
deferBlockStates: DeferBlockState.Loading,
})
componentProviders
Coleção de providers necessários para renderizar o componente via Injeção de Dependência.
Estes serão fornecidos no nível do componente. Para injetar dependências no nível do módulo, use providers.
Para mais informações, consulte a documentação do Angular.
padrão: []
exemplo:
await render(AppComponent, {
componentProviders: [AppComponentService],
})
componentImports
Coleção de imports para sobrescrever os imports de um componente standalone.
padrão: undefined
exemplo:
await render(AppComponent, {
componentImports: [MockChildComponent],
})
childComponentOverrides
Coleção de providers especificados de componentes filhos para sobrescrever.
padrão: undefined
exemplo:
await render(AppComponent, {
childComponentOverrides: [
{
component: ChildOfAppComponent,
providers: [{provide: ChildService, useValue: {hello: 'world'}}],
},
],
})
detectChangesOnRender
Invoca detectChanges após o componente ser renderizado.
padrão: true
exemplo:
await render(AppComponent, {detectChangesOnRender: false})
autoDetectChanges
Detecta automaticamente mudanças como um componente em execução "real" faria, por exemplo, executando um ciclo de detecção de mudanças quando um evento ocorre.
padrão: true
exemplo:
await render(AppComponent, {
autoDetectChanges: false,
})
excludeComponentDeclaration
Exclui o componente para que não seja automaticamente adicionado como declaração. Necessário quando o componente é declarado em um módulo importado, como em SCAMs.
padrão: false
exemplo:
await render(AppComponent, {
imports: [AppModule], // a module that includes AppComponent
excludeComponentDeclaration: true,
})
imports
Coleção de imports necessários para renderizar o componente, como módulos compartilhados. Adiciona NoopAnimationsModule por padrão se BrowserAnimationsModule não estiver na coleção.
Para mais informações, consulte a documentação do Angular.
padrão: [NoopAnimationsModule]
exemplo:
await render(AppComponent, {
imports: [AppSharedModule, MaterialModule],
})
providers
Coleção de providers necessários para renderizar o componente via Injeção de Dependência.
Serão fornecidos no nível do módulo. Para injetar dependências no nível do componente, use componentProviders.
Para mais informações, consulte a documentação do Angular.
padrão: []
exemplo:
await render(AppComponent, {
providers: [
CustomersService,
{
provide: MAX_CUSTOMERS_TOKEN,
useValue: 10,
},
],
})
queries
Consultas (queries) para vincular. Substitui o conjunto padrão da DOM Testing Library, a menos que mesclado.
padrão: undefined
exemplo:
await render(AppComponent, {
queries: {...queries, ...customQueries},
})
routes
Configuração de rotas para configurar o serviço de roteamento via RouterTestingModule.withRoutes. Para mais informações, consulte a documentação de Rotas do Angular.
padrão: []
exemplo:
await render(AppComponent, {
declarations: [ChildComponent],
routes: [
{
path: '',
children: [
{
path: 'child/:id',
component: ChildComponent,
},
],
},
],
})
schemas
Coleção de schemas necessários para renderizar o componente. Valores permitidos: NO_ERRORS_SCHEMA e CUSTOM_ELEMENTS_SCHEMA.
Para mais informações, consulte a documentação do Angular.
padrão: []
exemplo:
await render(AppComponent, {
schemas: [NO_ERRORS_SCHEMA],
})
removeAngularAttributes
Remove atributos do Angular (ng-version e root-id) do fixture.
padrão: false
exemplo:
await render(AppComponent, {
removeAngularAttributes: true,
})
componentInputs (descontinuado)
componentInputsUm objeto para definir propriedades @Input do componente. Utiliza setInput para atribuir
o valor da propriedade de entrada. Lança um erro se a propriedade do componente não estiver
anotada com o atributo @Input.
padrão : {}
exemplo:
await render(AppComponent, {
componentInputs: {
counterValue: 10,
},
})
componentOutputs (obsoleto)
componentOutputsUm objeto para definir propriedades @Output do componente.
padrão : {}
exemplo:
await render(AppComponent, {
componentOutputs: {
clicked: (value) => { ... }
}
})
componentProperties (obsoleto)
componentPropertiesUm objeto para definir propriedades @Input e @Output do componente. Não oferece
o mesmo controle refinado que inputs e on.
padrão : {}
exemplo:
await render(AppComponent, {
componentProperties: {
// an input
counterValue: 10,
// an output
send: (value) => { ... }
// a public property
name: 'Tim'
}
})
RenderResult
container
O nó DOM que contém seu Componente Angular renderizado. É um nó DOM comum,
permitindo chamar container.querySelector etc. para inspecionar os elementos filhos.
debug
Exibe o DOM do componente com destaque de sintaxe. Aceita um parâmetro opcional para exibir um nó DOM específico.
const {debug} = await render(AppComponent)
debug()
rerender
Altera as propriedades de entrada da instância existente do componente seguindo
o ciclo de vida de componentes Angular (ou seja, ngOnChanges é chamado). Propriedades
de entrada não definidas são limpas.
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()
Usando partialUpdate, apenas as propriedades recém-fornecidas serão atualizadas. Outras
propriedades de entrada não fornecidas não serão limpas.
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
Dispara um ciclo de detecção de alterações para o componente.
Para mais informações, consulte a documentação Angular.
debugElement
O DebugElement Angular do componente.
Para mais informações, consulte a documentação Angular.
fixture
O ComponentFixture Angular do componente.
Para mais informações, consulte a documentação Angular.
const {fixture} = await render(AppComponent)
// componentInstance is typed as AppComponent
const componentInstance = fixture.componentInstance
🚨 Se você se pegar usando
fixturepara acessar valores internos do componente, reconsidere! Isso provavelmente significa que você está testando detalhes de implementação.
navigate
Aceita um elemento DOM ou um caminho como parâmetro. Se um elemento for passado,
navigate navegará para o valor href do elemento. Se um caminho for passado,
navigate navegará para esse caminho.
const { navigate } = await render(AppComponent, {
routes: [...]
})
await navigate(component.getByLabelText('To details'))
await navigate('details/3')
...queries
A funcionalidade mais importante do render é que as queries do
DOM Testing Library são automaticamente
retornadas com seu primeiro argumento vinculado ao componente sendo testado.
Veja Queries para a lista completa.
exemplo:
const {getByText, queryByLabelText} = await render(AppComponent)
screen.getByRole('heading', {
name: /api/i,
})
queryByLabelText(/First name/i')
renderDeferBlock
Para testar visualizações diferíveis, você pode usar
renderDeferBlock. renderDeferBlock define o estado diferível desejado para um bloco específico.
O valor padrão de uma visualização diferível é Placeholder, mas você também pode definir
o estado inicial durante a renderização do componente.
const {renderDeferBlock} = await render(FixtureComponent, {
deferBlockStates: DeferBlockState.Loading,
})
expect(screen.getByText(/loading/i)).toBeInTheDocument()
await renderDeferBlock(DeferBlockState.Complete)
expect(screen.getByText(/completed/i)).toBeInTheDocument()