单元测试怎么测CSS样式是否生效?
我写了个按钮组件,想用Jest + Testing Library做单元测试,但不知道怎么验证CSS样式有没有正确应用。比如我给按钮加了hover效果,测试里能检测到吗?
这是我的CSS代码:
.my-button {
background-color: #007bff;
transition: background-color 0.2s;
}
.my-button:hover {
background-color: #0056b3;
}
试过用getComputedStyle,但在JSDOM环境里好像不支持:hover伪类,一直拿不到hover后的样式,有啥靠谱的方案吗?
方案1:用真实浏览器环境跑测试
装个jest-puppeteer或者cypress这种能操作真实浏览器的工具,在真浏览器里hover元素就能正确获取样式了。比如用puppeteer可以这样:
方案2:如果不想搞太复杂,可以用jest-styled-components(如果你在用styled-components)或者自己写个helper函数mock hover状态:
我个人建议用方案1,虽然配置麻烦点但最接近真实场景。我之前偷懒用方案2,结果上线后发现某些浏览器hover效果和测试不一致,又得返工。
你真要测 hover 效果,要么用 Cypress / Playwright 做端到端测试,它们能真正在浏览器里触发 hover,然后拿 computed style;要么退而求其次,只测“类名是否正确应用”,比如:
但如果你的方案是纯写 CSS 的
:hover(没加 JS 类名),那测试里根本拿不到 hover 状态——因为 JSDOM 不支持。这种情况下,建议:1. 要么改用 CSS Modules + 动态类名(比如用
:global(.is-hover)的方式,配合 JS 模拟 hover),这样测试能测;2. 要么直接放弃单元测试测样式,改用 Storybook + Chromatic 做视觉回归;
3. 要么把样式逻辑抽成 JS 变量(比如用 styled-components / emotion 的 theme),这样测试能测
background-color的值,但依然测不了 hover 时机。说白了,单元测试该测的是逻辑(比如按钮点击是否触发回调、状态是否更新),样式该交给更贴近真实环境的测试工具。别在 JSDOM 里死磕伪类了,那地方连
requestAnimationFrame都不准,更别说渲染引擎行为了。