Zum Hauptinhalt springen

Stencil

Stencil ist eine Bibliothek zum Erstellen wiederverwendbarer, skalierbarer Komponentenbibliotheken. Sie können Stencil-Komponenten direkt in einem echten Browser mit WebdriverIO und seinem Browser-Runner testen.

Einrichtung

Um WebdriverIO in Ihrem Stencil-Projekt einzurichten, folgen Sie den Anweisungen in unserer Komponententest-Dokumentation. Stellen Sie sicher, dass Sie stencil als Preset in Ihren Runner-Optionen auswählen, z.B.:

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

Falls Sie Stencil mit einem Framework wie React oder Vue verwenden, sollten Sie das Preset für diese Frameworks beibehalten.

Sie können dann die Tests starten, indem Sie Folgendes ausführen:

npx wdio run ./wdio.conf.ts

Tests schreiben

Angenommen, Sie haben die folgende Stencil-Komponente:

./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

Verwenden Sie in Ihrem Test die render-Methode aus @wdio/browser-runner/stencil, um die Komponente an die Testseite anzuhängen. Um mit der Komponente zu interagieren, empfehlen wir die Verwendung von WebdriverIO-Befehlen, da diese sich näher an tatsächlichen Benutzerinteraktionen orientieren, z.B.:

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

Render-Optionen

Die render-Methode bietet folgende Optionen:

components

Ein Array von zu testenden Komponenten. Komponentenklassen können in die Spec-Datei importiert werden, dann sollte ihre Referenz zum component-Array hinzugefügt werden, um im gesamten Test verwendet zu werden.

Typ: CustomElementConstructor[]
Standard: []

flushQueue

Wenn false, wird die Render-Warteschlange bei der initialen Testeinrichtung nicht geleert.

Typ: boolean
Standard: true

template

Das anfängliche JSX, das zur Generierung des Tests verwendet wird. Verwenden Sie template, wenn Sie eine Komponente mit ihren Eigenschaften initialisieren möchten, anstatt mit ihren HTML-Attributen. Es rendert das angegebene Template (JSX) in document.body.

Typ: JSX.Template

html

Das anfängliche HTML, das zur Generierung des Tests verwendet wird. Dies kann nützlich sein, um eine Sammlung von zusammenarbeitenden Komponenten zu erstellen und HTML-Attribute zuzuweisen.

Typ: string

language

Setzt das simulierte lang-Attribut auf <html>.

Typ: string

autoApplyChanges

Standardmäßig müssen alle Änderungen an Komponenteneigenschaften und -attributen env.waitForChanges() abwarten, um die Aktualisierungen zu testen. Optional leert autoApplyChanges kontinuierlich die Warteschlange im Hintergrund.

Typ: boolean
Standard: false

attachStyles

Standardmäßig werden Stile nicht an das DOM angehängt und sie werden nicht in der serialisierten HTML-Ausgabe angezeigt. Wenn Sie diese Option auf true setzen, werden die Stile der Komponente in die serialisierbare Ausgabe aufgenommen.

Typ: boolean
Standard: false

Render-Umgebung

Die render-Methode gibt ein Umgebungsobjekt zurück, das bestimmte Hilfsfunktionen zur Verwaltung der Komponentenumgebung bereitstellt.

flushAll

Nachdem Änderungen an einer Komponente vorgenommen wurden, wie z.B. eine Aktualisierung einer Eigenschaft oder eines Attributs, wendet die Testseite die Änderungen nicht automatisch an. Um auf die Aktualisierung zu warten und sie anzuwenden, rufen Sie await flushAll() auf.

Typ: () => void

unmount

Entfernt das Container-Element aus dem DOM.

Typ: () => void

styles

Alle von Komponenten definierten Stile.

Typ: Record<string, string>

container

Container-Element, in dem das Template gerendert wird.

Typ: HTMLElement

$container

Das Container-Element als WebdriverIO-Element.

Typ: WebdriverIO.Element

root

Die Wurzelkomponente des Templates.

Typ: HTMLElement

$root

Die Wurzelkomponente als WebdriverIO-Element.

Typ: WebdriverIO.Element

waitForChanges

Hilfsmethode, um zu warten, bis die Komponente bereit ist.

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

Element-Aktualisierungen

Wenn Sie Eigenschaften oder Zustände in Ihrer Stencil-Komponente definieren, müssen Sie verwalten, wann diese Änderungen auf die Komponente angewendet werden sollen, damit sie neu gerendert wird.

Beispiele

Ein vollständiges Beispiel einer WebdriverIO-Komponententestsuite für Stencil finden Sie in unserem Beispiel-Repository.

Welcome! How can I help?

WebdriverIO AI Copilot