Saltar al contenido principal

Stencil

Stencil es una biblioteca para construir bibliotecas de componentes reutilizables y escalables. Puedes probar componentes de Stencil directamente en un navegador real usando WebdriverIO y su ejecutor de navegador.

Configuración

Para configurar WebdriverIO dentro de tu proyecto Stencil, sigue las instrucciones en nuestra documentación de pruebas de componentes. Asegúrate de seleccionar stencil como preset dentro de tus opciones de ejecutor, por ejemplo:

// wdio.conf.js
export const config = {
// ...
runner: ['browser', {
preset: 'stencil'
}],
// ...
}
información

En caso de que uses Stencil con un framework como React o Vue, deberías mantener el preset para estos frameworks.

Luego puedes iniciar las pruebas ejecutando:

npx wdio run ./wdio.conf.ts

Escribiendo Pruebas

Dado que tienes los siguientes componentes de 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

En tu prueba, usa el método render de @wdio/browser-runner/stencil para adjuntar el componente a la página de prueba. Para interactuar con el componente, recomendamos usar comandos de WebdriverIO ya que se comportan más cerca de las interacciones reales del usuario, por ejemplo:

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.')
})
})

Opciones de Render

El método render proporciona las siguientes opciones:

components

Un array de componentes para probar. Las clases de componentes pueden importarse en el archivo de especificación, luego su referencia debe agregarse al array component para ser utilizado a lo largo de la prueba.

Tipo: CustomElementConstructor[]
Predeterminado: []

flushQueue

Si es false, no vacía la cola de renderizado en la configuración inicial de la prueba.

Tipo: boolean
Predeterminado: true

template

El JSX inicial que se utiliza para generar la prueba. Usa template cuando quieras inicializar un componente usando sus propiedades, en lugar de sus atributos HTML. Renderizará la plantilla especificada (JSX) en document.body.

Tipo: JSX.Template

html

El HTML inicial utilizado para generar la prueba. Esto puede ser útil para construir una colección de componentes que trabajen juntos y asignar atributos HTML.

Tipo: string

language

Establece el atributo lang simulado en <html>.

Tipo: string

autoApplyChanges

Por defecto, cualquier cambio en las propiedades y atributos del componente debe usar env.waitForChanges() para probar las actualizaciones. Como opción, autoApplyChanges vacía continuamente la cola en segundo plano.

Tipo: boolean
Predeterminado: false

attachStyles

Por defecto, los estilos no se adjuntan al DOM y no se reflejan en el HTML serializado. Establecer esta opción en true incluirá los estilos del componente en la salida serializable.

Tipo: boolean
Predeterminado: false

Entorno de Render

El método render devuelve un objeto de entorno que proporciona ciertos ayudantes de utilidad para gestionar el entorno del componente.

flushAll

Después de realizar cambios en un componente, como una actualización de una propiedad o atributo, la página de prueba no aplica automáticamente los cambios. Para esperar y aplicar la actualización, llama a await flushAll()

Tipo: () => void

unmount

Elimina el elemento contenedor del DOM.

Tipo: () => void

styles

Todos los estilos definidos por los componentes.

Tipo: Record<string, string>

container

Elemento contenedor en el que se renderiza la plantilla.

Tipo: HTMLElement

$container

El elemento contenedor como un elemento WebdriverIO.

Tipo: WebdriverIO.Element

root

El componente raíz de la plantilla.

Tipo: HTMLElement

$root

El componente raíz como un elemento WebdriverIO.

Tipo: WebdriverIO.Element

waitForChanges

Método auxiliar para esperar a que el componente esté listo.

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()

Actualizaciones de Elementos

Si defines propiedades o estados en tu componente Stencil, debes gestionar cuándo estos cambios deben aplicarse al componente para que se vuelva a renderizar.

Ejemplos

Puedes encontrar un ejemplo completo de un conjunto de pruebas de componentes WebdriverIO para Stencil en nuestro repositorio de ejemplos.

Welcome! How can I help?

WebdriverIO AI Copilot