Перейти до основного вмісту

Stencil

Stencil — це бібліотека для створення повторно використовуваних, масштабованих бібліотек компонентів. Ви можете тестувати компоненти Stencil безпосередньо у реальному браузері, використовуючи WebdriverIO та його браузерний запускач.

Налаштування

Щоб налаштувати WebdriverIO у вашому проекті Stencil, дотримуйтесь інструкцій в нашій документації з тестування компонентів. Переконайтеся, що вибрали stencil як пресет у опціях запускача, наприклад:

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

У випадку, якщо ви використовуєте Stencil з фреймворком, таким як React або Vue, вам слід зберегти пресет для цих фреймворків.

Після цього ви можете запустити тести, виконавши:

npx wdio run ./wdio.conf.ts

Написання тестів

Припустимо, у вас є наступні компоненти 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

У своєму тесті використовуйте метод render з @wdio/browser-runner/stencil, щоб прикріпити компонент до тестової сторінки. Для взаємодії з компонентом ми рекомендуємо використовувати команди WebdriverIO, оскільки вони поводяться ближче до реальних взаємодій користувача, наприклад:

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

Метод render надає наступні опції:

components

Масив компонентів для тестування. Класи компонентів можна імпортувати у файл специфікації, потім їх посилання слід додати до масиву component для використання протягом тесту.

Тип: CustomElementConstructor[]
За замовчуванням: []

flushQueue

Якщо false, не очищати чергу рендерингу при початковому налаштуванні тесту.

Тип: boolean
За замовчуванням: true

template

Початковий JSX, який використовується для генерації тесту. Використовуйте template, коли ви хочете ініціалізувати компонент, використовуючи їхні властивості, а не HTML-атрибути. Це рендерить вказаний шаблон (JSX) у document.body.

Тип: JSX.Template

html

Початковий HTML, який використовується для генерації тесту. Це може бути корисно для створення колекції компонентів, що працюють разом, і призначення HTML-атрибутів.

Тип: string

language

Встановлює мокований атрибут lang на <html>.

Тип: string

autoApplyChanges

За замовчуванням, будь-які зміни властивостей та атрибутів компонента повинні використовувати env.waitForChanges() для тестування оновлень. Як опція, autoApplyChanges безперервно очищає чергу у фоновому режимі.

Тип: boolean
За замовчуванням: false

attachStyles

За замовчуванням, стилі не приєднуються до DOM і не відображаються у серіалізованому HTML. Встановлення цієї опції в true включить стилі компонента у серіалізований вихід.

Тип: boolean
За замовчуванням: false

Середовище Render

Метод render повертає об'єкт середовища, який надає певні допоміжні утиліти для управління середовищем компонента.

flushAll

Після внесення змін до компонента, таких як оновлення властивості або атрибута, тестова сторінка не застосовує зміни автоматично. Щоб дочекатися та застосувати оновлення, викличте await flushAll()

Тип: () => void

unmount

Видаляє елемент контейнера з DOM.

Тип: () => void

styles

Усі стилі, визначені компонентами.

Тип: Record<string, string>

container

Елемент контейнера, в якому рендериться шаблон.

Тип: HTMLElement

$container

Елемент контейнера як елемент WebdriverIO.

Тип: WebdriverIO.Element

root

Кореневий компонент шаблону.

Тип: HTMLElement

$root

Кореневий компонент як елемент WebdriverIO.

Тип: WebdriverIO.Element

waitForChanges

Допоміжний метод для очікування готовності компонента.

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

Оновлення елементів

Якщо ви визначаєте властивості чи стани у вашому компоненті Stencil, вам потрібно керувати тим, коли ці зміни повинні бути застосовані до компонента для його перерендерингу.

Приклади

Ви можете знайти повний приклад набору тестів компонентів WebdriverIO для Stencil у нашому репозиторії прикладів.

Welcome! How can I help?

WebdriverIO AI Copilot