web-dev-qa-db-fra.com

Jest avec TypeScript: TypeError: environment.teardown n'est pas une fonction

Je reçois cette erreur lorsque j'essaie d'exécuter mes tests avec 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

Je suis tombé sur une solution possible ici: Comment résoudre TypeError: environment.teardown n’est pas une fonction?

Mais après avoir fait ce qui était suggéré: supprimer mon fichier yarn.lock, le dossier node_modules, supprimer Jest de mon package.json et réinstaller le tout avec du fil - j'ai rencontré un nouveau problème: 

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

J'ai l'impression que la solution précédente fonctionnait pour les autres parce qu'ils utilisaient create-react-app et installaient ensuite une version conflictuelle de plaisanterie à côté. Si tel est le cas, la solution ci-dessus ne s'applique pas à mon problème car je n'ai pas utilisé create-react-app

J'ai donc réinstallé jest et @ types/jest et j'ai maintenant le même problème initial ... 

Ceci est ma config de 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
            }
          }
        ]
      }
    ]
  }
}

Ceci est mon 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"
  }
}

C'est ma plaisanterie config: 

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

Et enfin, voici mon tsconfig:

{
    "compilerOptions": {
        "module": "commonjs",
        "target": "es5",
        "jsx": "react",
        "noImplicitAny": true,
        "removeComments": true,
        "preserveConstEnums": true,
        "sourceMap": true,
    },
    "include": [
        "./src/**/*",
    ],
    "exclude": [
        "node_modules",
    ]
}
4
Matt

TLDR

Cette erreur signifie souvent qu'il y a un jest-environment-jsdom et/ou jest-environment-node installé à la racine de node_modules qui est incompatible avec la version de Jest utilisée pour exécuter les tests.

Détails

Celui-ci était intéressant.

Le problème est css-modules. Il a une dépendance sur [email protected] (qui aurait dû être sous ses devDependencies).

[email protected] finit par installer [email protected] et [email protected] qui aboutissent à la racine de node_modules.

jest@^23.5.0 est installé, ce qui installe jest-environment-jsdom@^23.4.0 et jest-environment-node@^23.4.0 à plusieurs endroits dans node_modules/jest, mais pas au niveau racine de node_modules car les versions 20.0.3 sont présentes.

Lorsqu'un testEnvironment est spécifié pour Jest, le processus de résolution recherche l'environnement. Le premier endroit où il essaie est dans le projet qui dans ce cas résout les versions 20.0.3.

Ces versions antérieures des environnements de test ne contiennent pas tout ce qui est requis par les versions ultérieures de Jest, y compris une définition de teardown().

Supprimez css-modules de package.json, supprimez votre package-lock.json et/ou yarn.lock et node_modules et exécutez npm install. Cela devrait tout clarifier. 

(Notez que css-modulesne contient que 133 téléchargements hebdomadaires et aucun site github répertorié , je suppose qu'il a été ajouté comme dépendance par erreur, il n'est pas associé à Modules CSS )

12

Juste au cas où quelqu'un d'autre trébucherait à l'intérieur d'un projet utilisant des espaces de travail en fil, j'ai résolu le même problème en en ne remontant pasjest à la racine du projet:

"workspaces": {
    "packages": [
        "packages/*"
    ],
    "nohoist": [
        "**/jest/**",
        "**/jest"
    ]
},
1
bkegley