使用TypeScript进行Jest:TypeError:environment.teardown不是函数

Mat*_*att 5 javascript node.js typescript jestjs

当我尝试使用Jest运行测试时出现此错误:

 FAIL  src/__tests__/jokeGenerator.test.tsx
  ? Test suite failed to run

    TypeError: environment.teardown is not a function

      at node_modules/jest-runner/build/run_test.js:230:25
Run Code Online (Sandbox Code Playgroud)

我在这里遇到了一个可能的解决方案:如何解决TypeError:environment.teardown不是一个函数?

但在做了以下建议:删除我的yarn.lock文件,node_modules文件夹,从我的package.json中删除Jest,然后再用纱线重新安装所有内容 - 我遇到了一个新问题:

  ? Test suite failed to run

    TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string

      at assertPath (path.js:39:11)
      at Object.relative (path.js:1173:5)
      at Object.getCacheKey (node_modules/ts-jest/dist/utils/get-cache-key.js:15:16)
Run Code Online (Sandbox Code Playgroud)

我有一种预感,以前解决方案对其他解决方案起作用的原因是因为他们使用create-react-app然后安装了与之相冲突的版本.如果是这种情况,那么上述解决方案不适用于我的问题,因为我没有使用create-react-app.

所以我重新安装了jest和@ types/jest,现在有了同样的初始问题......

这是我的webpack配置:

module.exports = {
  entry: './src/index.tsx',
  devServer: {
    contentBase: __dirname + '/dist/',
  },
  module : {
    rules: [
      {
        test: /\.tsx?$/,
        exclude: /node_modules/,
        use: {
          loader: 'ts-loader'
        }
      },
      {
        test: /\.css$/,
        exclude: /node_modules/,
        use: [
          'style-loader',
          {
            loader: 'typings-for-css-modules-loader?modules?named',
            options: {
              modules: true,
              namedExport: true
            }
          }
        ]
      }
    ]
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我的package.json:

{
  "name": "practice-testing",
  "private": true,
  "version": "1.0.0",
  "description": "",
  "scripts": {
    "start": "webpack-dev-server --mode development --open --hot",
    "build": "webpack --mode production",
    "test": "jest"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@types/jest": "^23.3.1",
    "@types/react": "^16.4.9",
    "@types/react-dom": "^16.0.7",
    "babel-core": "^6.26.3",
    "babel-jest": "^23.4.2",
    "css-loader": "^1.0.0",
    "css-modules": "^0.3.0",
    "jest": "^23.5.0",
    "react-testing-library": "^5.0.0",
    "style-loader": "^0.22.1",
    "ts-jest": "^23.1.3",
    "ts-loader": "^4.4.2",
    "typescript": "^3.0.1",
    "typings-for-css-modules-loader": "^1.7.0",
    "webpack": "^4.16.5",
    "webpack-cli": "^3.1.0",
    "webpack-dev-server": "^3.1.5"
  },
  "dependencies": {
    "react": "^16.4.2",
    "react-dom": "^16.4.2"
  },
  "jest": {
    "testEnvironment": "node"
  }
}
Run Code Online (Sandbox Code Playgroud)

这是我的开玩笑配置:

module.exports = {
  "roots": [
    "<rootDir>/src"
  ],
  "transform": {
    "^.+\\.tsx?$": "ts-jest"
  },
  "testRegex": "(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$",
  "moduleFileExtensions": [
    "ts",
    "tsx",
    "js",
    "jsx",
    "json",
    "node"
  ],
}
Run Code Online (Sandbox Code Playgroud)

最后,这是我的tsconfig:

{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es5",
        "jsx": "react",
        "noImplicitAny": true,
        "removeComments": true,
        "preserveConstEnums": true,
        "sourceMap": true,
    },
    "include": [
        "./src/**/*",
    ],
    "exclude": [
        "node_modules",
    ]
}
Run Code Online (Sandbox Code Playgroud)

Bri*_*ams 19

TLDR

此错误通常意味着在根目录中存在jest-environment-jsdom和/或jest-environment-node安装node_modulesJest用于运行测试的版本不兼容.

细节

这个很有意思.

问题是css-modules.它依赖于jest@20.0.4(应该在其devDependencies下).

jest@20.0.4结束了安装jest-environment-jsdom@20.0.3jest-environment-node@20.0.3其中在根目录的最后node_modules.

jest@^23.5.0安装了哪些安装,jest-environment-jsdom@^23.4.0并安装jest-environment-node@^23.4.0在多个位置node_modules/jest,但不是在根级别,node_modules因为20.0.3版本在那里.

testEnvironment指定a时Jest,解析过程将查找环境. 它尝试的第一个地方是在这个案例中解析20.0.3版本的项目.

那些早期版本的测试环境不包含更高版本所需的所有内容Jest,包括其定义teardown().

删除css-modulespackage.json,删除package-lock.json和/或yarn.locknode_modules和运行npm install,并且应该明确的事情了.

(请注意,css-modules 每周只有133次下载且没有列出的github网站,我猜它是错误地添加为依赖项,它与CSS模块没有关联)


bke*_*ley 6

以防万一其他人在使用纱线工作区的项目中偶然发现此问题,我通过不提升 jest到项目根目录解决了同样的问题:

"workspaces": {
    "packages": [
        "packages/*"
    ],
    "nohoist": [
        "**/jest/**",
        "**/jest"
    ]
},
Run Code Online (Sandbox Code Playgroud)