استنسیل
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 زیر را دارید:
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 را توصیه میکنیم زیرا رفتار آنها به تعاملات واقعی کاربر نزدیکتر است، به عنوان مثال:
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
آرایهای از مؤلفهها برای آزمایش. کلاسهای مؤلفه میتوانند به فایل spec وارد شوند، سپس مرجع آنها باید به آرایه 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 را در مخزن نمونه ما پیدا کنید.