运行 Cypress 使用 TailwindCSS 3 进行测试
Running Cypress tests with TailwindCSS 3
我通过 cypress open-ct
运行 我的组件测试已经有一段时间了,依赖于导入 /node_modules/tailwindcss/dist/tailwindcss.min.css
.
自从升级到 Tailwind v3 后,我的一些测试失败了,因为没有我可以导入的预构建 CSS 文件 - 所有内容都是及时生成的。
例如,测试在单击固定且全宽的叠加层时模态是否关闭,因为整个模态已呈现,因此 Cypress 无法访问它。
由于无法访问 Tailwind 类 而导致的另一个附带问题是,在 CI 中进行 运行 测试时录制的视频无法使用,因为它们只是一堆随机的原生视频元素。
我一直在每个测试文件的顶部(在描述之前)像这样导入 Tailwind
import { mount } from '@cypress/vue'
import '/node_modules/tailwindcss/dist/tailwind.min.css'
import MultiSelectField from './MultiSelectField.vue'
import { ref } from "vue";
关于如何包含 Tailwind(最好是全局)以使测试不会失败的任何想法?
我看到您正在使用 import '/node_modules/tailwindcss/dist/tailwind.min.css'
,它需要一个预编译的包。如果您在 tailwind 配置中添加了任何自定义项,则不会涵盖这些内容。
但是如果你不能使用生成的 css 并且没有任何顺风定制,你可以使用来自 https://cdn.tailwindcss.com/
的 cdn 版本
因为您 运行 它正在测试中并且不想增加使用远程依赖项可能的“脆弱性”,您可能想要下载该文件并将其保存在 repo 中并且不时手动更新它。您还可以使用一些自动化功能在 运行 测试之前从 cdn 获取正确的版本,但理想情况下您会使用生成的 css,因为这就是您要运送的内容,所以这是应该的资源正在接受测试。
您可以使用 Tailwind CLI 即时生成样式表。
在 cypress/plugins/tailwind.js
中添加此插件(确保将 -i
源从 ./src/styles/globals.css
更改为您的基础 CSS 文件:
before(() => {
cy.exec('npx tailwindcss -i ./src/styles/globals.css -m').then(
({ stdout }) => {
if (!document.head.querySelector('#tailwind-style')) {
const link = document.createElement('style')
link.id = 'tailwind-style'
link.innerHTML = stdout
document.head.appendChild(link)
}
},
)
})
然后,通过在 cypress/support/index.js
中导入来加载插件:
import '../plugins/tailwind'
您还应该设置一个 separate config file for your component tests,例如 cypress/support/component.js
,并在您的 cypress.json
配置文件中指定:
{
"component": {
"supportFile": "cypress/support/component.js",
},
"e2e": {
"supportFile": "cypress/support/e2e.js"
}
}
然后,只在您的 cypress/support/component.js
配置文件中包含 import '../plugins/tailwind'
,这样您就不会为 E2E 测试执行 JIT 编译(因为这是不必要的)。
我通过 cypress open-ct
运行 我的组件测试已经有一段时间了,依赖于导入 /node_modules/tailwindcss/dist/tailwindcss.min.css
.
自从升级到 Tailwind v3 后,我的一些测试失败了,因为没有我可以导入的预构建 CSS 文件 - 所有内容都是及时生成的。
例如,测试在单击固定且全宽的叠加层时模态是否关闭,因为整个模态已呈现,因此 Cypress 无法访问它。
由于无法访问 Tailwind 类 而导致的另一个附带问题是,在 CI 中进行 运行 测试时录制的视频无法使用,因为它们只是一堆随机的原生视频元素。
我一直在每个测试文件的顶部(在描述之前)像这样导入 Tailwind
import { mount } from '@cypress/vue'
import '/node_modules/tailwindcss/dist/tailwind.min.css'
import MultiSelectField from './MultiSelectField.vue'
import { ref } from "vue";
关于如何包含 Tailwind(最好是全局)以使测试不会失败的任何想法?
我看到您正在使用 import '/node_modules/tailwindcss/dist/tailwind.min.css'
,它需要一个预编译的包。如果您在 tailwind 配置中添加了任何自定义项,则不会涵盖这些内容。
但是如果你不能使用生成的 css 并且没有任何顺风定制,你可以使用来自 https://cdn.tailwindcss.com/
因为您 运行 它正在测试中并且不想增加使用远程依赖项可能的“脆弱性”,您可能想要下载该文件并将其保存在 repo 中并且不时手动更新它。您还可以使用一些自动化功能在 运行 测试之前从 cdn 获取正确的版本,但理想情况下您会使用生成的 css,因为这就是您要运送的内容,所以这是应该的资源正在接受测试。
您可以使用 Tailwind CLI 即时生成样式表。
在 cypress/plugins/tailwind.js
中添加此插件(确保将 -i
源从 ./src/styles/globals.css
更改为您的基础 CSS 文件:
before(() => {
cy.exec('npx tailwindcss -i ./src/styles/globals.css -m').then(
({ stdout }) => {
if (!document.head.querySelector('#tailwind-style')) {
const link = document.createElement('style')
link.id = 'tailwind-style'
link.innerHTML = stdout
document.head.appendChild(link)
}
},
)
})
然后,通过在 cypress/support/index.js
中导入来加载插件:
import '../plugins/tailwind'
您还应该设置一个 separate config file for your component tests,例如 cypress/support/component.js
,并在您的 cypress.json
配置文件中指定:
{
"component": {
"supportFile": "cypress/support/component.js",
},
"e2e": {
"supportFile": "cypress/support/e2e.js"
}
}
然后,只在您的 cypress/support/component.js
配置文件中包含 import '../plugins/tailwind'
,这样您就不会为 E2E 测试执行 JIT 编译(因为这是不必要的)。