【发布时间】:2020-09-10 09:08:36
【问题描述】:
我有一个带有单个文件组件的 vue 应用程序,我想添加单元测试来测试组件。我正在尝试像here 中描述的那样使用 jest,但我不断收到错误消息“Jest 遇到了意外的令牌”,其中包含以下详细信息:
/some_path/MyRecipe.vue:1
<template>
^
SyntaxError: Unexpected token <
1 | import { shallowMount } from "@vue/test-utils"
> 2 | import MyRecipe from "../src/components/MyRecipe.vue"
| ^
3 |
4 | describe('MyRecipe', () => {
5 | test('is a Vue instance', () => {
at Runtime._execModule (node_modules/jest-runtime/build/index.js:1166:56)
at Object.<anonymous> (__tests__/MyRecipe.test.js:2:1)
经过一些研究(例如来自here),我认为这可能是因为开玩笑期望一个 .js 文件,但是 .vue 单文件组件中包含 html、javascript 和 css,通常由 webpack 和加载器。我尝试按照各种教程中的 jest 配置来使 jest 使用 vue-jest 转换 .vue 文件,但错误仍然存在。这是我的 package.json 文件(删除了不必要的部分):
{
"name": "all-recipes ",
"version": "0.1.0",
"private": true,
"scripts": {
// ...
"test": "jest"
},
"dependencies": {
// ...
"core-js": "^3.4.3",
"vue": "^2.6.10"
// ...
},
"devDependencies": {
"@vue/cli-plugin-babel": "^4.1.0",
"@vue/cli-plugin-eslint": "^4.1.0",
"@vue/cli-service": "^4.1.0",
"@vue/test-utils": "^1.0.3",
"babel-core": "^7.0.0-bridge.0",
"babel-eslint": "^10.0.3",
"babel-jest": "^26.0.1",
// ...
"jest": "^26.0.1",
"jest-serializer-vue": "^2.0.2",
"vue-jest": "^3.0.5",
"vue-template-compiler": "^2.6.10",
"vue-test-utils": "^1.0.0-beta.11"
},
// ...
"jest": {
"moduleFileExtensions": [
"js",
"json",
"vue"
],
"transform": {
".*\\.,(vue)$": "vue-jest",
"^.+\\.js$": "babel-jest"
},
"snapshotSerializers": [
"jest-serializer-vue"
]
}
}
知道可能出了什么问题,或者关于如何调试它的一些提示?
编辑:我已经研究了this 问题,但我不相信那里的答案会解决我的问题,因为我要导入的是 .vue 文件而不是 .html 文件。
编辑 2:我觉得 jest 不知何故只是没有接受转换,因为从 package.json 中删除它们不会改变任何东西。
编辑 3:不,jest 正确地使用 vue-jest 进行转换。如果我卸载 vue-jest 并尝试再次运行测试,jest 会抱怨缺少 vue-jest。
【问题讨论】:
-
这能回答你的问题吗? Jest + Vue - SyntaxError: Unexpected token <
-
@JózefPodlecki 不幸的是,没有。在您引用的问题中,尝试导入 .html 文件时出现错误。我不相信创建自定义 html-loader 会解决这个问题,因为 .vue 文件也包含 javascript 和 css。
-
你有
".*\\.,(vue)$": "<rootDir>/node_modules/vue-jest"的任何理由,而不仅仅是".*\\.(vue)$": "vue-jest"as is stated in the docs? -
这是我遵循的其他教程之一的建议,是我最初尝试“vue-jest”后尝试的。我现在只是试着把它改回来,以防不时发生变化,但不幸的是,这并没有奏效。
-
为了排除故障,我会生成一个新的 Vue CLI 项目,包括 Jest(它没有这个问题),然后找出其中的区别(例如,将它与你的项目进行比较)。跨度>
标签: javascript vue.js jestjs