unit-testing - 如何用 jest 测试自定义 Web 组件?
问题描述
我想测试一些自定义 Web 组件并使用 jest.js 作为测试运行器(因为它支持 ES6)。
Chromium 支持类似的命令
window.customElements.define('my-custom-element', MyCustomElementClass);
注册自定义 Web 组件。
但是,window.customElements
在开玩笑测试的背景下似乎并不为人所知。
作为一种解决方法,我尝试将jest 与 puppeteer 和 express 结合使用customElements
以在 Chromium中运行该部分。
但是,我很难TreezElement
在评估的代码中注入自定义元素类:
treezElement.js:
class TreezElement extends HTMLElement {
connectedCallback () {
this.innerHTML = 'Hello, World!';
}
}
treezElement.test.js:
import TreezElement from '../../src/components/treezElement.js';
import puppeteer from 'puppeteer';
import express from 'express';
describe('Construction', ()=>{
let port = 3000;
let browser;
let page;
let element;
const width = 800;
const height = 800;
beforeAll(async () => {
const app = await express()
.use((req, res) => {
res.send(
`<!DOCTYPE html>
<html>
<body>
<div id="root"></div>
</body>
</html>`
)
})
.listen(port);
browser = await puppeteer.launch({
headless: false,
slowMo: 80,
args: [`--window-size=${width},${height}`]
});
var pages = await browser.pages();
page = pages[0];
await page.setViewport({ width, height });
await page.goto('http://localhost:3000');
element = await page.evaluate(({TreezElement}) => {
console.log('TreezElement:')
console.log(TreezElement);
window.customElements.define('treez-element', TreezElement);
var element = document.create('treez-element');
document.body.appendChild(element);
return element;
}, {TreezElement});
});
it('TreezElement', ()=>{
});
afterAll(() => {
browser.close();
});
});
也许TreezElement
是不可序列化的,因此undefined
被传递给函数。
如果我尝试TreezElement
直接从评估代码中导入自定义元素类...
element = await page.evaluate(() => {
import TreezElement from '../../src/components/treezElement.js';
console.log('TreezElement:')
console.log(TreezElement);
window.customElements.define('treez-element', TreezElement);
var element = document.create('treez-element');
document.body.appendChild(element);
return element;
});
...我得到了错误
'import' 和 'export' 只能出现在顶层
=> 用 jest 测试自定义 Web 组件的推荐方法是什么?
一些相关的东西:
解决方案
我创建了一个支持 Web 组件的服务器端渲染的 DOM。它还支持使用 Jest 测试 Web 组件。
DOM:
https://www.npmjs.com/package/happy-dom
开玩笑环境:
https://www.npmjs.com/package/jest-environment-happy-dom
安装它
npm install jest-environment-happy-dom --save-dev
要使用它:
编辑您的 package.json 以包含 Jest 环境:
{
"scripts": {
"test": "jest --env=jest-environment-happy-dom"
}
}
推荐阅读
- cypress - Is it possible to use OS variables to define JSON object for Cypress configuration?
- java - 我该怎么做呢?插口插件
- spring-boot - 我厌倦了等待这么久的junit测试
- web - 哪个网站更适合托管静态网站?
- android - 颤动中实时数据库项目(firebase)的日志记录在中途停止
- bootstrap-4 - Domino 12 升级后的 Bootstrap 3 Flat.theme 问题
- apm - 自定义 APM 代理
- android-studio - 加密蓝牙聊天
- python - 如何使用'hh:mm:ss'格式验证计时器中的每个数字,其中0 <= mm,ss <= 59?
- excel - 条件格式,除非单元格为空白