wvi*_*ana 16 javascript css sass jestjs babel-jest
使用jest运行测试时出现以下错误。
console.error
Error: Could not parse CSS stylesheet
at exports.createStylesheet ([PERSONAL_PATH]/node_modules/jsdom/lib/jsdom/living/helpers/stylesheets.js:34:21)
at HTMLStyleElementImpl._updateAStyleBlock ([PERSONAL_PATH]/node_modules/jsdom/lib/jsdom/living/nodes/HTMLStyleElement-impl.js:68:5)
at HTMLStyleElementImpl._childTextContentChangeSteps ([PERSONAL_PATH]/node_modules/jsdom/lib/jsdom/living/nodes/HTMLStyleElement-impl.js:36:12)
at HTMLStyleElementImpl._insert ([PERSONAL_PATH]/node_modules/jsdom/lib/jsdom/living/nodes/Node-impl.js:832:14)
at HTMLStyleElementImpl._preInsert ([PERSONAL_PATH]/node_modules/jsdom/lib/jsdom/living/nodes/Node-impl.js:768:10)
at HTMLStyleElementImpl._append ([PERSONAL_PATH]/node_modules/jsdom/lib/jsdom/living/nodes/Node-impl.js:868:17)
at HTMLStyleElementImpl.appendChild ([PERSONAL_PATH]/node_modules/jsdom/lib/jsdom/living/nodes/Node-impl.js:610:17)
at HTMLStyleElement.appendChild ([PERSONAL_PATH]/node_modules/jsdom/lib/jsdom/living/generated/Node.js:395:60)
at StyleSheet.insert ([PERSONAL_PATH]/node_modules/@emotion/sheet/dist/sheet.cjs.dev.js:121:11)
at Object.insert ([PERSONAL_PATH]/node_modules/@emotion/cache/dist/cache.cjs.dev.js:168:19) {width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;}/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ[BLOB]== */
at VirtualConsole.<anonymous> (node_modules/jsdom/lib/jsdom/virtual-console.js:29:45)
at exports.createStylesheet (node_modules/jsdom/lib/jsdom/living/helpers/stylesheets.js:38:63)
at HTMLStyleElementImpl._updateAStyleBlock (node_modules/jsdom/lib/jsdom/living/nodes/HTMLStyleElement-impl.js:68:5)
at HTMLStyleElementImpl._childTextContentChangeSteps (node_modules/jsdom/lib/jsdom/living/nodes/HTMLStyleElement-impl.js:36:12)
at HTMLStyleElementImpl._insert (node_modules/jsdom/lib/jsdom/living/nodes/Node-impl.js:832:14)
at HTMLStyleElementImpl._preInsert (node_modules/jsdom/lib/jsdom/living/nodes/Node-impl.js:768:10)
Run Code Online (Sandbox Code Playgroud)
我尝试在packages.json上设置jsdom版本,还尝试更新jest包。没有改变错误。它实际上并没有导致测试失败,但它污染了笑话输出 。
如果需要更多详细信息,请在评论中询问,而不是我编辑此问题。
这是测试组件的 sass 文件:
$spacing-medium: 2.4rem
$spacing-small: 1.6rem
$color-green: #3aa537
$color-white: #ffffff
$color-super-pale-gray: #f0f0f0
$color-pale-gray: #e6e6e6
$color-border-pale-gray: #b3b3b3
$tundora: #4d4d4d
$boulder: #757575
$electric-blue: #2251ff
$font-size-large: 1.6rem
$font-family-regular: "Arial", sans-serif
$font-family-bold: "Arial Bold", sans-serif
$[PRIVATE]-sans-regular-font-family: '[PRIVATE] Sans Regular', $font-family-regular
$[PRIVATE]-sans-medium-font-family: '[PRIVATE] Sans Medium', $font-family-bold
$font-size-medium: 1.4rem
@font-face
font-family: [PRIVATE] Sans Medium
src: url('https://cdn.[PRIVATE].com/assets/fonts/web/[PRIVATE]Sans-Medium.woff2') format('woff2')
@font-face
font-family: [PRIVATE] Sans Regular
src: url('https://cdn.[PRIVATE].com/assets/fonts/web/[PRIVATE]Sans-Regular.woff2') format('woff2')
.margin-cell
margin-left: -12px
.active
color: $color-green
font-family: $[PRIVATE]-sans-medium-font-family
margin-left: -12px
section
margin: 1rem 0
nav.sub-navigation
background-color: $color-white
padding: $spacing-medium
a.sub-navigation-active
display: inline-flex
color: $electric-blue
font-size: $font-size-large
font-family: $[PRIVATE]-sans-medium-font-family
text-decoration: none
border-bottom: 4px solid $electric-blue
padding-bottom: 1rem
div.grid-container
padding: $spacing-small 0 $spacing-small 0
font-size: $font-size-medium
background-color: $color-white
display: grid
.group-key
font-family: $[PRIVATE]-sans-medium-font-family
color: $tundora
margin-bottom: 10px
.input-style
width: 100%
font-family: $[PRIVATE]-sans-regular-font-family
height: 30px
padding: 0 $spacing-small
color: $tundora
font-size: $font-size-medium
.group-divider
padding: $spacing-small 10px $spacing-small 10px
.advanced-configurations-container
width: 100%
font-size: $font-size-medium
.advanced-configurations-header
font-size: $font-size-medium
color: $electric-blue
width: unset
div.info-group
padding: 0 0 $spacing-small $spacing-medium
font-size: 1.4rem
background-color: $color-white
border-top: 2px solid $color-super-pale-gray
display: grid
grid-template-columns: 1fr 1fr
div.group-subsection
display: grid
padding: 0.8rem 0
margin: 10px 25px 10px 0
height: 50px
&.variable-height
height: unset
min-height: 50px
.group-key
font-family: $[PRIVATE]-sans-medium-font-family
color: $tundora
margin-bottom: 10px
.info-group-internal
display: grid
grid-template-columns: 1fr 1fr
.icons-holder
display: flex
justify-content: center
gap: 26px
.tab
margin-top: $spacing-medium
.filter-wrapper
padding: $spacing-small $spacing-medium $spacing-small $spacing-medium
background-color: $color-white
border-top: 1px solid $color-pale-gray
.search-input
width: 300px
height: 32px
.modal-form
.form-row
display: flex
margin: $spacing-medium 0
gap: $spacing-medium
> .form-column
flex: 1
.input-wrapper
height: 32px
textarea
//border: $color-pale-gray solid 1px
color: $tundora
height: 24px
min-height: 9rem
overflow: hidden
padding: 10px
resize: none
.question-label
color: $tundora
font-family: $[PRIVATE]-sans-medium-font-family
display: block
font-weight: bold
margin-bottom: 10px
font-size: 1.4rem
Run Code Online (Sandbox Code Playgroud)
这是我的jest.config.js:
console.error
Error: Could not parse CSS stylesheet
at exports.createStylesheet ([PERSONAL_PATH]/node_modules/jsdom/lib/jsdom/living/helpers/stylesheets.js:34:21)
at HTMLStyleElementImpl._updateAStyleBlock ([PERSONAL_PATH]/node_modules/jsdom/lib/jsdom/living/nodes/HTMLStyleElement-impl.js:68:5)
at HTMLStyleElementImpl._childTextContentChangeSteps ([PERSONAL_PATH]/node_modules/jsdom/lib/jsdom/living/nodes/HTMLStyleElement-impl.js:36:12)
at HTMLStyleElementImpl._insert ([PERSONAL_PATH]/node_modules/jsdom/lib/jsdom/living/nodes/Node-impl.js:832:14)
at HTMLStyleElementImpl._preInsert ([PERSONAL_PATH]/node_modules/jsdom/lib/jsdom/living/nodes/Node-impl.js:768:10)
at HTMLStyleElementImpl._append ([PERSONAL_PATH]/node_modules/jsdom/lib/jsdom/living/nodes/Node-impl.js:868:17)
at HTMLStyleElementImpl.appendChild ([PERSONAL_PATH]/node_modules/jsdom/lib/jsdom/living/nodes/Node-impl.js:610:17)
at HTMLStyleElement.appendChild ([PERSONAL_PATH]/node_modules/jsdom/lib/jsdom/living/generated/Node.js:395:60)
at StyleSheet.insert ([PERSONAL_PATH]/node_modules/@emotion/sheet/dist/sheet.cjs.dev.js:121:11)
at Object.insert ([PERSONAL_PATH]/node_modules/@emotion/cache/dist/cache.cjs.dev.js:168:19) {width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;}/*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ[BLOB]== */
at VirtualConsole.<anonymous> (node_modules/jsdom/lib/jsdom/virtual-console.js:29:45)
at exports.createStylesheet (node_modules/jsdom/lib/jsdom/living/helpers/stylesheets.js:38:63)
at HTMLStyleElementImpl._updateAStyleBlock (node_modules/jsdom/lib/jsdom/living/nodes/HTMLStyleElement-impl.js:68:5)
at HTMLStyleElementImpl._childTextContentChangeSteps (node_modules/jsdom/lib/jsdom/living/nodes/HTMLStyleElement-impl.js:36:12)
at HTMLStyleElementImpl._insert (node_modules/jsdom/lib/jsdom/living/nodes/Node-impl.js:832:14)
at HTMLStyleElementImpl._preInsert (node_modules/jsdom/lib/jsdom/living/nodes/Node-impl.js:768:10)
Run Code Online (Sandbox Code Playgroud)
我已经开始将这些内容与我正在测试的组件隔离开来,直到其中只有一个组件。所以我发现第三方库中的日期选择器导致了问题。我确实克隆了它,运行了他们的测试,注意到他们正在使用另一个库来渲染测试中的组件。发现他们也有testing-library/react,创建了另一个使用它来渲染的测试,但没有成功重现错误。有人对我下一步可以尝试什么有什么建议吗?我已经没有主意了。
小智 10
这里有一个开放的问题: https: //github.com/jsdom/jsdom/issues/2230,说你应该将 jsdom 配置更改为:
const jsdom = require('jsdom');
const { JSDOM } = jsdom;
const virtualConsole = new jsdom.VirtualConsole();
virtualConsole.on("error", () => {
// No-op to skip console errors.
});
const dom = new JSDOM(``, { virtualConsole });
Run Code Online (Sandbox Code Playgroud)
(直接从 git 问题复制)。
同样的答案也可以在这里找到:JSDOM: Could not parse CSS stylesheet。
这里还提到了另一个问题,https://github.com/styled-components/styled-components/issues/1931,似乎将多行注释更改为单行注释解决了某些人的问题。
我相信 jsdom 没有那么强大的 CSS 支持,或者它似乎在尝试解析 CSS 时遇到了奇怪的问题。
但是我不认为解决方案是解析 CSS,您应该使用 jest 转换或 moduleNameMapper 来模拟 css 并导入空对象,没有理由测试样式。
根据笑话文档,https://jestjs.io/docs/webpack#mocking-css-modules,您可以使用 moduleNameMapper:
"moduleNameMapper": {
"\\.(css|less)$": "<rootDir>/__mocks__/styleMock.js",
"\\.(gif|ttf|eot|svg)$": "<rootDir>/__mocks__/fileMock.js"
}
Run Code Online (Sandbox Code Playgroud)
然后在 fileMock.js 中您可以导出一个空对象。
您还可以使用变换:
"transform": {
"\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$": "<rootDir>/fileTransformer.js"
}
Run Code Online (Sandbox Code Playgroud)
然后在该 fileTransformer.js 文件中,您还可以导出一个空对象。
弹出错误信息...
由于样式表使用了 [jsdom] CSS 解析器不支持的(合法)功能。 GitHub问题上的来源评论
在同一个线程中有一个对我有用的解决方案。我稍微修改了一下:
// in setupTests.js
const originalConsoleError = console.error;
console.error = function (...data) {
if (
typeof data[0]?.toString === 'function' &&
data[0].toString().includes('Error: Could not parse CSS stylesheet')
) return;
originalConsoleError(...data);
};
Run Code Online (Sandbox Code Playgroud)