Pular para o conteúdo principal

Stencil

Stencil é uma biblioteca para construir bibliotecas de componentes reutilizáveis e escaláveis. Você pode testar componentes Stencil diretamente em um navegador real usando WebdriverIO e seu browser runner.

Configuração

Para configurar o WebdriverIO dentro do seu projeto Stencil, siga as instruções em nossa documentação de teste de componentes. Certifique-se de selecionar stencil como preset dentro das suas opções de runner, por exemplo:

// wdio.conf.js
export const config = {
// ...
runner: ['browser', {
preset: 'stencil'
}],
// ...
}
informação

Caso você use Stencil com um framework como React ou Vue, você deve manter o preset para esses frameworks.

Você pode então iniciar os testes executando:

npx wdio run ./wdio.conf.ts

Escrevendo Testes

Dado que você tem os seguintes componentes Stencil:

./components/Component.tsx
import { Component, Prop, h } from '@stencil/core'

@Component({
tag: 'my-name',
shadow: true
})
export class MyName {
@Prop() name: string

normalize(name: string): string {
if (name) {
return name.slice(0, 1).toUpperCase() + name.slice(1).toLowerCase()
}
return ''
}

render() {
return (
<div class="text">
<p>Hello! My name is {this.normalize(this.name)}.</p>
</div>
)
}
}

render

No seu teste, use o método render de @wdio/browser-runner/stencil para anexar o componente à página de teste. Para interagir com o componente, recomendamos usar comandos WebdriverIO, pois eles se comportam mais próximos das interações reais do usuário, por exemplo:

app.test.tsx
import { expect } from '@wdio/globals'
import { render } from '@wdio/browser-runner/stencil'

import MyNameComponent from './components/Component.tsx'

describe('Stencil Component Testing', () => {
it('should render component correctly', async () => {
await render({
components: [MyNameComponent],
template: () => (
<my-name name={'stencil'}></my-name>
)
})
await expect($('.text')).toHaveText('Hello! My name is Stencil.')
})
})

Opções de Renderização

O método render fornece as seguintes opções:

components

Uma matriz de componentes para testar. As classes de componentes podem ser importadas para o arquivo de especificação, então sua referência deve ser adicionada à matriz component para ser usada em todo o teste.

Tipo: CustomElementConstructor[]
Padrão: []

flushQueue

Se false, não limpa a fila de renderização na configuração inicial do teste.

Tipo: boolean
Padrão: true

template

O JSX inicial que é usado para gerar o teste. Use template quando quiser inicializar um componente usando suas propriedades, em vez de seus atributos HTML. Ele renderizará o template especificado (JSX) no document.body.

Tipo: JSX.Template

html

O HTML inicial usado para gerar o teste. Isso pode ser útil para construir uma coleção de componentes trabalhando juntos e atribuir atributos HTML.

Tipo: string

language

Define o atributo lang simulado em <html>.

Tipo: string

autoApplyChanges

Por padrão, quaisquer alterações nas propriedades e atributos do componente devem usar env.waitForChanges() para testar as atualizações. Como opção, autoApplyChanges limpa continuamente a fila em segundo plano.

Tipo: boolean
Padrão: false

attachStyles

Por padrão, os estilos não são anexados ao DOM e não são refletidos no HTML serializado. Definir esta opção como true incluirá os estilos do componente na saída serializável.

Tipo: boolean
Padrão: false

Ambiente de Renderização

O método render retorna um objeto de ambiente que fornece certos auxiliares de utilidade para gerenciar o ambiente do componente.

flushAll

Depois que as alterações foram feitas em um componente, como uma atualização em uma propriedade ou atributo, a página de teste não aplica automaticamente as alterações. Para esperar e aplicar a atualização, chame await flushAll()

Tipo: () => void

unmount

Remove o elemento de contêiner do DOM.

Tipo: () => void

styles

Todos os estilos definidos pelos componentes.

Tipo: Record<string, string>

container

Elemento de contêiner no qual o template está sendo renderizado.

Tipo: HTMLElement

$container

O elemento de contêiner como um elemento WebdriverIO.

Tipo: WebdriverIO.Element

root

O componente raiz do template.

Tipo: HTMLElement

$root

O componente raiz como um elemento WebdriverIO.

Tipo: WebdriverIO.Element

waitForChanges

Método auxiliar para esperar que o componente esteja pronto.

import { render, waitForChanges } from '@wdio/browser-runner/stencil'
import { MyComponent } from './component.tsx'

const page = render({
components: [MyComponent],
html: '<my-component></my-component>'
})

expect(page.root.querySelector('div')).not.toBeDefined()
await waitForChanges()
expect(page.root.querySelector('div')).toBeDefined()

Atualizações de Elementos

Se você definir propriedades ou estados em seu componente Stencil, você precisa gerenciar quando essas mudanças devem ser aplicadas ao componente para ser re-renderizado.

Exemplos

Você pode encontrar um exemplo completo de uma suíte de teste de componente WebdriverIO para Stencil em nosso repositório de exemplos.

Welcome! How can I help?

WebdriverIO AI Copilot