Run jest在ScriptTransformer._transformAndBuildScript中获得了"Unexpected string"

Jia*_*hen 13 vue.js jestjs

在Vuejs项目中,节点版本:v10.6.0

Package.json版本:

 "devDependencies": {
    "@vue/cli-plugin-babel": "^3.0.0-rc.4",
    "@vue/cli-plugin-unit-jest": "^3.0.0-rc.4",
    "@vue/cli-service": "^3.0.0-rc.4",
    "@vue/test-utils": "^1.0.0-beta.20",
    "babel-core": "7.0.0-bridge.0",
    "babel-jest": "^23.0.1",
    "vue-template-compiler": "^2.5.16"
  },
Run Code Online (Sandbox Code Playgroud)

当我使用内置任务运行它时,

"test:unit": "vue-cli-service test:unit"
Run Code Online (Sandbox Code Playgroud)

但是因为我想调试,所以我使用node命令手动运行:

node  node_modules/.bin/jest
Run Code Online (Sandbox Code Playgroud)

它给出以下错误:

 FAIL  tests/unit/HelloWorld1.spec.js
  ? Test suite failed to run

    .../tests/unit/HelloWorld1.spec.js:1
    ({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){import "core-js/modules/es6.array.iterator";
                                                                                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    SyntaxError: Unexpected string

      at ScriptTransformer._transformAndBuildScript (node_modules/jest-runtime/build/script_transformer.js:403:17)
Run Code Online (Sandbox Code Playgroud)

之后我添加了.babelrc以及以下内容

{"env": {
    "development": {
        "plugins": ["transform-es2015-modules-commonjs"]
    },
    "test": {
        "plugins": ["transform-es2015-modules-commonjs"]
    }
}}
Run Code Online (Sandbox Code Playgroud)

事情变得更好了,它可以在没有"导入"的情况下传递测试文件,一旦导入,它将显示不同的错误:

....tests/unit/HelloWorld1.spec.js:3
    import _interopRequireWildcard from "..../node_modules/@babel/runtime/helpers/builtin/es6/interopRequireWildcard";
           ^^^^^^^^^^^^^^^^^^^^^^^

    SyntaxError: Unexpected identifier

      at ScriptTransformer._transformAndBuildScript (node_modules/jest-runtime/build/script_transformer.js:403:17)
Run Code Online (Sandbox Code Playgroud)

Jia*_*hen 14

经过几天的挣扎.最后,我得到了在VueJs应用程序的调试模式下运行jest的解决方案.

在调入vue-cli-service之后@vue/cli-plugin-unit-jest,我发现了以下代码,然后产生了jest进程:

 process.env.VUE_CLI_BABEL_TARGET_NODE = true
 process.env.VUE_CLI_BABEL_TRANSPILE_MODULES = true
Run Code Online (Sandbox Code Playgroud)

所以解决方案非常简单.

只需在运行jest命令之前添加这两个环境变量.以下命令将在调试模式下启动jest:

export VUE_CLI_BABEL_TARGET_NODE=true
export VUE_CLI_BABEL_TRANSPILE_MODULES=true
./node_modules/jest/bin/jest.js --clearCache
node --inspect-brk ./node_modules/jest/bin/jest.js -i
Run Code Online (Sandbox Code Playgroud)

笔记

  • 确保不要 添加".babel.rc",这将使VueJS babel成为现实.

  • 通常,您需要使用该--clearCache选项运行jest .否则,陈旧生成的文件也会搞乱.

  • 开玩笑选项-i也很重要.否则,测试将在单独的进程中运行,该进程不会处于调试模式.