在 Jest TypeScript 中找不到名称“它”
Posted
技术标签:
【中文标题】在 Jest TypeScript 中找不到名称“它”【英文标题】:Cannot find name 'it' in Jest TypeScript 【发布时间】:2019-10-28 21:46:18 【问题描述】:我尝试在 React + TypeScript 中为 Jest 创建一个初始设置。我已完成初始设置并尝试检查测试是否运行。
当我使用命令npm test
运行测试时,出现以下错误:
Cannot find name 'it'. Do you need to install type definitions for a test runner? Try `npm i @types/jest` or `npm i @types/mocha`.
我已经安装了 Jest 的类型并删除了 tsconfig.json
中的类型,但我仍然遇到同样的错误。
"compilerOptions":
"target": "es6",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"strict": true,
"forceConsistentCasingInFileNames": true,
"module": "esnext",
"moduleResolution": "node",
"plugins": [ "name": "typescript-tslint-plugin" ],
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true,
"jsx": "preserve",
"pretty": true,
"baseUrl": "src",
"types": ["jest"],
"typeRoots": ["./src/types"],
"suppressImplicitAnyIndexErrors": true
,
"include": ["src", "node_modules/@types/jest"],
"exclude": ["node_modules"]
`
包.json
"jest":
"transform":
".(ts|tsx)": "ts-jest"
,
"testRegex": "(/__tests__/.*|\\.(test|spec))\\.(ts|tsx|js)$",
"moduleFileExtensions": [
"ts",
"tsx",
"js"
]
,
"devDependencies":
"@babel/plugin-proposal-export-default-from": "^7.2.0",
"@types/enzyme": "^3.9.3",
"@types/jest": "^24.0.14",
"enzyme": "^3.10.0",
"gh-pages": "^1.2.0",
"husky": "^2.2.0",
"jest": "^24.8.0",
"node-sass": "^4.11.0",
"prettier": "^1.17.0",
"react-scripts": "2.1.8",
"react-test-renderer": "^16.8.6",
"stylelint": "^9.3.0",
"stylelint-config-recommended-scss": "^3.2.0",
"stylelint-config-standard": "^18.2.0",
"stylelint-order": "^0.8.1",
"stylelint-scss": "^3.1.3",
"ts-jest": "^24.0.2",
"tslint": "^5.16.0",
"tslint-config-prettier": "^1.18.0",
"tslint-plugin-prettier": "^2.0.1",
"tslint-react": "^4.0.0",
"tslint-react-hooks": "^2.1.0"
【问题讨论】:
【参考方案1】:以上解决方案都不适合我。甚至没有导入 '@types/jest' ,这在进行 npm 测试以导入 'jest' 时会引发错误。对我来说唯一的解决方案是 import describe, it, beforeEach from '@jest/globals' to test files
【讨论】:
【参考方案2】:我必须在我的tsconfig.json
中将"@types/jest"
添加到我的"types"
数组中。
【讨论】:
【参考方案3】:我已经尝试了上述所有解决方案,但不幸的是,没有一个适合我。在我的情况下,解决方案是通过文件顶部的/// <reference types="@types/jest" />;
引用类型定义。您需要先安装@types/jest
包。它的缺点是您必须将其导入到所有文件中。
【讨论】:
【参考方案4】:将其导入您的任何测试文件中:
import '@types/jest';
【讨论】:
这对我有用。但我不知道为什么。而且我不想每次都导入它。 人类的救星。由于 lerna 的提升性质,这让我在像 lerna 这样的 monorepos 中遇到问题。【参考方案5】:我不得不在 devDependency 中安装 jest:
npm i --save-dev @types/jest
【讨论】:
【参考方案6】:安装 @types/jest npm install @types/jest
并在 package.json 中将配置添加到 jest
...
"jest":
"globals":
"ts-jest":
"tsconfig": "path_our_tests/jest.tsconfig.json"
创建文件 jest.tsconfig.json 到 test 目录中,如下所示:
"extends": "../tsconfig.json",
"compilerOptions":
"types": ["jest"]
这样您就不会更改项目的全局配置,并防止破坏您的代码
【讨论】:
【参考方案7】:就我而言,问题是我的./node_modules/@types
目录中实际上没有jest
文件夹。运行npm i @types/jest
声称该软件包是up to date
,但它仍然不存在于我应该安装的node_modules/@types
中,因此错误仍然存在。
我通过全局安装@types/jest
并将安装的包复制到我的./node_modules/@types
来解决此问题。
要全局安装@jest/types
:
npm i -g @types/jest
要获取全局 node_modules 的路径,请运行:
npm root -g
要确认@types/jest
包是否存在,请运行:
ls $(npm root -g)/@types
然后 cd 进入你的项目目录并运行
cp -R $(npm root -g)/@types/jest ./node_modules/@types
将其复制到您的本地 node_modules。
【讨论】:
【参考方案8】:对我来说,问题在于我的 tsconfig.json
是用
"include": [
"src"
]
我不得不把它改成
"include": [
"src",
"tests"
]
(我的测试都在目录'tests'中)
【讨论】:
这将在不理想的输出目录中包含测试文件夹 @schystz 我同意这并不理想,但到目前为止,这是让我的测试不让 eslint 发疯的唯一方法。我还尝试将我的 tests 文件夹移动到我的 src 文件夹中,希望以某种方式继承会允许找到 jest 类型,但排除会阻止它出现在输出中。唉,没有。如果其他人有任何建议,我会接受。【参考方案9】:安装
npm install jest @types/jest ts-jest
jest.config.js -- 在根目录
module.exports =
roots: ['<rootDir>/src'],
transform:
'^.+\\.tsx?$': 'ts-jest',
,
testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$',
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
tsconfig.json
"compilerOptions":
...
"types": ["reflect-metadata", "jest"],
"typeRoots": ["./types", "./node_modules/@types"]
...
,
"exclude": ["node_modules", "**/*.spec.ts", "**/*.test.ts"],
"include": ["./src/**/*.tsx", "./src/**/*.ts"]
【讨论】:
非常感谢!我缺少的是在“类型”中添加“反射元数据” 真的很有帮助!"types": ["reflect-metadata", "jest"],
。很有帮助。
你应该使用npm install jest @types/jest ts-jest -D
,将它们保存为开发依赖而不是常规依赖。【参考方案10】:
将ts-loader
更新为v6.0.1
或更高版本可以解决问题。
【讨论】:
【参考方案11】:在 tsconfig.json 中添加以下代码
"types": ["jest"],
"typeRoots": ["./src/types", "node_modules/@types"],
【讨论】:
我不需要使用第 2 行 有趣的是,我不需要第一行。将node_modules/@types
添加到typeRoots
为我解决了这个问题
第一个成功了。谢谢!以上是关于在 Jest TypeScript 中找不到名称“它”的主要内容,如果未能解决你的问题,请参考以下文章
TS-2304 错误 - 在“.ts”文件中导入“jquery”时在 TypeScript 中找不到名称“Iterable”
在使用 jest 的 vue 测试中找不到模块“@jest/globals”
在 Angular 7 中找不到名称“require”(打字稿 3.1.3)
使用 Jest 测试 NUXT.js 和 Vue.js 应用程序。获取“在 mapState() 中找不到 [vuex] 模块命名空间”和“[vuex] 未知操作类型”