Vai al contenuto principale

Stencil

Stencil è una libreria per la creazione di librerie di componenti riutilizzabili e scalabili. Puoi testare i componenti Stencil direttamente in un browser reale utilizzando WebdriverIO e il suo browser runner.

Setup

Per configurare WebdriverIO all'interno del tuo progetto Stencil, segui le istruzioni nella nostra documentazione sui test dei componenti. Assicurati di selezionare stencil come preset nelle tue opzioni di runner, ad esempio:

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

Nel caso in cui utilizzi Stencil con un framework come React o Vue, dovresti mantenere il preset per questi framework.

Puoi quindi avviare i test eseguendo:

npx wdio run ./wdio.conf.ts

Scrittura dei Test

Dato che hai i seguenti componenti 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

Nel tuo test usa il metodo render da @wdio/browser-runner/stencil per collegare il componente alla pagina di test. Per interagire con il componente, consigliamo di utilizzare i comandi WebdriverIO in quanto si comportano in modo più simile alle interazioni effettive dell'utente, ad esempio:

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

Opzioni di Render

Il metodo render fornisce le seguenti opzioni:

components

Un array di componenti da testare. Le classi dei componenti possono essere importate nel file di specifica, quindi il loro riferimento dovrebbe essere aggiunto all'array component per essere utilizzato durante il test.

Type: CustomElementConstructor[]
Default: []

flushQueue

Se false, non svuota la coda di rendering durante la configurazione iniziale del test.

Type: boolean
Default: true

template

Il JSX iniziale utilizzato per generare il test. Usa template quando vuoi inizializzare un componente utilizzando le sue proprietà, invece dei suoi attributi HTML. Renderizzerà il template specificato (JSX) in document.body.

Type: JSX.Template

html

L'HTML iniziale utilizzato per generare il test. Questo può essere utile per costruire una collezione di componenti che lavorano insieme e assegnare attributi HTML.

Type: string

language

Imposta l'attributo lang simulato su <html>.

Type: string

autoApplyChanges

Per impostazione predefinita, qualsiasi modifica alle proprietà dei componenti e agli attributi deve utilizzare env.waitForChanges() per testare gli aggiornamenti. Come opzione, autoApplyChanges svuota continuamente la coda in background.

Type: boolean
Default: false

attachStyles

Per impostazione predefinita, gli stili non sono collegati al DOM e non sono riflessi nell'HTML serializzato. Impostando questa opzione su true includerà gli stili del componente nell'output serializzabile.

Type: boolean
Default: false

Ambiente di Rendering

Il metodo render restituisce un oggetto ambiente che fornisce determinati helper di utilità per gestire l'ambiente del componente.

flushAll

Dopo che sono state apportate modifiche a un componente, come un aggiornamento di una proprietà o attributo, la pagina di test non applica automaticamente le modifiche. Per attendere e applicare l'aggiornamento, chiama await flushAll()

Type: () => void

unmount

Rimuove l'elemento container dal DOM.

Type: () => void

styles

Tutti gli stili definiti dai componenti.

Type: Record<string, string>

container

Elemento container in cui viene renderizzato il template.

Type: HTMLElement

$container

L'elemento container come elemento WebdriverIO.

Type: WebdriverIO.Element

root

Il componente root del template.

Type: HTMLElement

$root

Il componente root come elemento WebdriverIO.

Type: WebdriverIO.Element

waitForChanges

Metodo di supporto per attendere che il componente sia 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()

Aggiornamenti degli Elementi

Se definisci proprietà o stati nel tuo componente Stencil, devi gestire quando queste modifiche dovrebbero essere applicate al componente per essere nuovamente renderizzato.

Esempi

Puoi trovare un esempio completo di una suite di test di componenti WebdriverIO per Stencil nel nostro repository di esempi.

Welcome! How can I help?

WebdriverIO AI Copilot