Monday, May 20, 2024
 Popular · Latest · Hot · Upcoming
157
rated 0 times [  164] [ 7]  / answers: 1 / hits: 11051  / 4 Years ago, sat, may 23, 2020, 12:00:00

I have a vue application with single file components and i want to add unit tests to test the components. I'm trying to use jest like described here but i keep getting the error Jest encountered an unexpected token with the following details:



/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)


After some research (e.g. from here) I gather that this is probably due to jest expecting a .js file, but the .vue single file components have html, javascript and css in them, usually dealt with by webpack and vue-loader. I've tried to follow jest configurations from various tutorials to make jest use vue-jest to transform .vue files, but the error persists. This is my package.json file (unnecessary parts removed):



{
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
]
}
}


Any idea what might be wrong, or some tips on how to debug this?



EDIT: I have looked into this question and I don't believe the answer there would solve my problem since what I am trying to import is a .vue file and not an .html file.



EDIT 2: I have a feeling that jest is somehow just not picking up the transforms, because removing them from package.json doesn't change anything.



EDIT 3: No, jest is correctly using vue-jest for transforming. If I uninstall vue-jest and try running the test again, jest complains that vue-jest is missing.


More From » vue.js

 Answers
2

The solution to my problem turns out to be a bit anti-climatic.



The problem was that my regexp string to recognize .vue files was wrong and didn't pick up my MyRecipe.vue file. Therefore, vue-jest wasn't used to transform it for jest to interpret, hence the trouble understanding that the file in question started with a very non-js line; <template>. The regexp that works is ^[^.]+.vue$, so the transform section of my package.json file becomes



{
// ...
jest: {
// ...
transform: {
^[^.]+.vue$: vue-jest,
^.+\.js$: babel-jest
},
// ...
}
}

[#3716] Wednesday, May 20, 2020, 4 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
tristab

Total Points: 735
Total Questions: 106
Total Answers: 96

Location: Grenada
Member since Sun, Dec 20, 2020
3 Years ago
tristab questions
Sat, Sep 25, 21, 00:00, 3 Years ago
Sun, Jan 31, 21, 00:00, 3 Years ago
Wed, Dec 2, 20, 00:00, 4 Years ago
Fri, Oct 23, 20, 00:00, 4 Years ago
;