Hoppa till huvudinnehåll

Stencil

Stencil är ett bibliotek för att bygga återanvändbara, skalbara komponentbibliotek. Du kan testa Stencil-komponenter direkt i en riktig webbläsare med hjälp av WebdriverIO och dess webbläsarkörning.

Installation

För att konfigurera WebdriverIO inom ditt Stencil-projekt, följ instruktionerna i våra komponenttestningsdokument. Se till att välja stencil som förinställning inom dina köralternativ, t.ex.:

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

Om du använder Stencil med ett ramverk som React eller Vue bör du behålla förinställningen för dessa ramverk.

Du kan sedan starta testerna genom att köra:

npx wdio run ./wdio.conf.ts

Skriva tester

Antag att du har följande Stencil-komponenter:

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

I ditt test, använd render-metoden från @wdio/browser-runner/stencil för att fästa komponenten på testsidan. För att interagera med komponenten rekommenderar vi att använda WebdriverIO-kommandon eftersom de beter sig närmare faktiska användarinteraktioner, t.ex.:

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-alternativ

render-metoden erbjuder följande alternativ:

components

En array av komponenter att testa. Komponentklasser kan importeras till spec-filen, sedan bör deras referens läggas till i component-arrayen för att användas genom hela testet.

Type: CustomElementConstructor[]
Default: []

flushQueue

Om false, spola inte renderingskön vid den initiala testuppsättningen.

Type: boolean
Default: true

template

Den initiala JSX som används för att generera testet. Använd template när du vill initiera en komponent med dess egenskaper, istället för dess HTML-attribut. Den kommer att rendera den angivna mallen (JSX) i document.body.

Type: JSX.Template

html

Den initiala HTML som används för att generera testet. Detta kan vara användbart för att konstruera en samling komponenter som arbetar tillsammans och tilldela HTML-attribut.

Type: string

language

Ställer in det simulerade lang-attributet på <html>.

Type: string

autoApplyChanges

Som standard måste alla ändringar i komponentegenskaper och attribut använda env.waitForChanges() för att testa uppdateringarna. Som ett alternativ spolar autoApplyChanges kontinuerligt kön i bakgrunden.

Type: boolean
Default: false

attachStyles

Som standard kopplas inte stilar till DOM och de återspeglas inte i den serialiserade HTML:en. Genom att ställa in detta alternativ till true inkluderas komponentens stilar i den serialiserbara utdata.

Type: boolean
Default: false

Render-miljö

render-metoden returnerar ett miljöobjekt som tillhandahåller vissa hjälpverktyg för att hantera komponentens miljö.

flushAll

Efter att ändringar har gjorts i en komponent, som en uppdatering av en egenskap eller attribut, tillämpar testsidan inte automatiskt ändringarna. För att vänta på och tillämpa uppdateringen, anropa await flushAll()

Type: () => void

unmount

Tar bort behållarelementet från DOM.

Type: () => void

styles

Alla stilar definierade av komponenter.

Type: Record<string, string>

container

Behållarelement där mallen renderas.

Type: HTMLElement

$container

Behållarelementet som ett WebdriverIO-element.

Type: WebdriverIO.Element

root

Rotkomponenten för mallen.

Type: HTMLElement

$root

Rotkomponenten som ett WebdriverIO-element.

Type: WebdriverIO.Element

waitForChanges

Hjälpmetod för att vänta på att komponenten ska vara redo.

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

Elementuppdateringar

Om du definierar egenskaper eller tillstånd i din Stencil-komponent måste du hantera när dessa ändringar ska tillämpas på komponenten för att renderas om.

Exempel

Du kan hitta ett komplett exempel på en WebdriverIO-komponenttestsvit för Stencil i vårt exempelförvar.

Welcome! How can I help?

WebdriverIO AI Copilot