如何使用 Jest 测试单个文件?
How do I test a single file using Jest?
我可以使用 Jest 测试多个文件,但我不知道如何测试单个文件。
我有:
- 运行
npm install jest-cli --save-dev
- 已更新
package.json
:`{ ...“脚本”:{“测试”:“笑话”} ...}
- 写了一些测试。
运行ning npm test
按预期工作(目前它运行 14 个测试)。
如何测试单个文件,例如测试 app/foo/__tests__/bar.spec.js
?
我已尝试 运行 npm test app/foo/__tests__/bar.spec.js
(从项目根目录),但出现以下错误:
npm ERR! Error: ENOENT, open '/node_modules/app/foo/tests/bar.spec.js/package.json'
至少从 2019 年开始:
npm test -- bar.spec.js
2015年:
为了运行 特定测试,您需要使用jest
命令。 npm test
将不起作用。要直接在命令行上访问 jest
,请通过 npm i -g jest-cli
或 yarn global add jest-cli
.
安装它
然后只需运行你的特定测试jest bar.spec.js
。
注意:您不必输入测试文件的完整路径。该参数被解释为正则表达式。唯一标识文件的完整路径的任何部分都可以。
你所要做的就是念咒语:
npm test -- SomeTestFileToRun
独立的 --
是 *nix 魔术,用于标记选项的结尾,这意味着(对于 NPM)之后的所有内容都传递给命令 运行,在这种情况下 jest
。另外,您可以通过说
来显示 Jest 使用说明
npm test -- --help
总之,呗
npm test -- Foo
运行s 命名文件中的测试 (FooBar.js
)。不过,您应该注意:
Jest 将名称视为区分大小写,因此如果您使用不区分大小写但保留大小写的文件系统(如 Windows NTFS),您可能会遇到奇怪的事情。
Jest 似乎将规范视为前缀。
所以上面的咒语会
- 运行
FooBar.js
、Foo.js
和 FooZilla.js
- 但是不是运行
foo.js
使用 npm test
并不意味着 Jest 是全局安装的。它只是意味着“测试”被映射到在你的 package.json
文件中使用 Jest。
以下工作,在项目的根级别:
npx jest [file or directory]
file or directory
可以是你要的测试文件运行也可以是包含多个文件的目录
要运行个人测试:
npm test -t ValidationUtil # `ValidationUtil` is my module `ValidationUtil.spec.js`
-t
- 在它后面放一个 正则表达式 包含测试名称。
如果使用Yarn,可以直接在.spec.js
或.test.js
文件后添加:
yarn test src/lib/myfile.test.js
这是我的 package.json
文件中将 Jest 安装为本地包的部分(删除了相关部分):
{
...
"scripts": {
"test": "jest",
"testw": "jest --watch",
"testc": "jest --coverage",
...
},
"devDependencies": {
"jest": "^18.1.0",
...
},
}
如果您 运行正在 npm >= 5.2.0
并且您已经在本地将 Jest 安装为 devDependencies
和 npm i -d jest
,您可以 运行 Jest 在特定的通过 npx jest /path/to/your/spec.js
.
文件
我刚刚将 Jest 安装为全局,运行 jest myFileToTest.spec.js
,它成功了。
这就是我在不重新启动测试的情况下动态 运行 测试特定文件的方式。
我的 React 项目创建为 create-react-app
。
因此它会监视更改测试,并在我进行更改时自动 运行 测试。
这就是我在终端中看到的测试结果:
Test Suites: 16 passed, 16 total
Tests: 98 passed, 98 total
Snapshots: 0 total
Time: 5.048s
Ran all test suites.
Watch Usage: Press w to show more.
按W
Watch Usage
› Press f to run only failed tests.
› Press o to only run tests related to changed files.
› Press q to quit watch mode.
› Press p to filter by a filename regex pattern.
› Press t to filter by a test name regex pattern.
› Press Enter to trigger a test run.
然后按P
Pattern Mode Usage
› Press Esc to exit pattern mode.
› Press Enter to filter by a filenames regex pattern.
pattern ›
Start typing to filter by a filename regex pattern.
这是在我想 运行 'Login' 文件夹中的 'index.es6.js' 文件之后:
Pattern Mode Usage
› Press Esc to exit pattern mode.
› Press Enter to filter by a filenames regex pattern.
pattern › login/index
Pattern matches 1 file
› src/containers/Login/index.es6.test.js
这就是我 运行 测试特定文件的方式。
您有两个选择:
选项 1:命令行。您可以运行以下命令
node '/Users/complete-path-to-you-project/your-project/node_modules/.bin/jest' '/Users/complete-path-to-you-project/your-project/path-to-your-file-within-the-project/your-file.spec.ts'
这样可以避免全局安装 Jest。您使用您的项目使用的笑话。
选项 2:如果您使用 Visual Studio Code you have a great plugin to do this: Jest Runner。它不仅允许您 运行 一个文件一个文件地进行测试,甚至还可以通过右键单击您想要 运行.
的测试来对特定套件和规范进行测试
Jest 将使用您传递的内容作为 regular expression 模式。它将匹配。
如果您想 运行 一个特定的测试文件,那么最好的方法是使用它的精确完整路径。 (您也可以指定某个相对路径,例如 (src/XFolder/index.spec.ts)).
在目录和 Linux 中提供完整路径的最简单方法是:
jest $PWD/index.spec.ts
注意变量的使用$PWD.
为了Windows! (待更新)
您可以使用 npm test --
:
的文件名
npm test -- fileName.jsx
也可以通过以下方式实现:
jest --findRelatedTests path/to/fileA.js
引用(Jest CLI Options)
如何在 Nx monorepo 中实现?这是答案(在目录 /path/to/workspace
中):
npx nx test api --findRelatedTests=apps/api/src/app/mytest.spec.ts
我们正在使用 nrwl-nx with Angular。在这种情况下我们可以使用这个命令:
npm test <ng-project> -- --testFile "file-name-part"
备注:
npm test
将 运行 package.json
中指定的测试脚本:
"test": "ng test"
--
:告诉 npm 将以下参数传递给测试脚本(而不是使用它们)
- 因此 cmd 的其余部分将传递给 ng test
<ng-project>
是angular.json
中的项目名称
- 当您省略此参数时,将使用
"defaultProject"
(在 angular.json
中指定)(因此您必须指定它,当测试不在您的默认项目中时)
- 接下来我们必须检查使用了哪个构建器:
- 在
angular.json
中导航至 "project"
- "<ng-project>"
- "architect"
- "test"
- 并检查
"builder"
,在我们的例子中是:"@nrwl/jest:jest"
- 现在我们知道了生成器,我们需要找到可用的命令行参数
- 在命令行中,运行
npm test <ng-project> -- --help
查看所有可用选项
- 或检查online documentation
- 其中一个选项是
--testFile
,这里使用
使用 Angular 和 Jest,您可以将其添加到“脚本”下的文件 package.json:
"test:debug": "node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand"
然后 运行 对特定文件进行单元测试,您可以在终端中编写此命令
npm run test:debug modules/myModule/someTest.spec.ts
不需要传递完整路径。只需使用正则表达式模式即可。
yarn jest --testNamePattern my_test_name
yarn jest -t=auth
yarn jest -t component # This will test all whose test name contains `component`
yarn jest --testPathPattern filename # This will match the file path
yarn jest filename # This will match the file path, the same with above
import LoggerService from '../LoggerService ';
describe('Method called****', () => {
it('00000000', () => {
const logEvent = jest.spyOn(LoggerService, 'logEvent');
expect(logEvent).toBeDefined();
});
});
用法:
npm test -- __tests__/LoggerService.test.ts -t '00000000'
对于 NestJS 用户,简单的替代方法是使用,
npm test -t <name of the spec file to run>
NestJS 预先配置了测试文件的正则表达式,以便在 Jest 的情况下搜索。
一个简单的例子是-
npm test -t app-util.spec.ts
(这是我的 .spec 文件名)
Jest 搜索 .spec 文件时不需要给出完整的路径,NestJS 默认情况下可用的配置:
"jest": {
"moduleFileExtensions": [
"js",
"json",
"ts"
],
"rootDir": "src",
"testRegex": ".spec.ts$",
"transform": {
"^.+\.(t|j)s$": "ts-jest"
},
"coverageDirectory": "../coverage",
"testEnvironment": "node"
}
}
"测试": "是 api/ds_server/ds_server.test.js"
来自 Jest 文档:
"scripts": {
"test": "jest path/to/my-test.js"
}
运行这个和
npm run test
当时我是用:
yarn test TestFileName.spec.js
你不应该输入完整的路径。这适用于 Windows 10 机器。
如果安装 Visual Studio 代码插件 Jest 运行ner,
您将在每个 describe
和 it
上方有 Debug/运行 选项。
您可以在 Visual Studio 代码中打开您的测试文件,然后单击其中一个选项。
一个简单有效的解决方案:
yarn test -g fileName
或
npm test -g fileName
示例:
yarn test -g cancelTransaction
或
npm test -g cancelTransaction
有关测试过滤器的更多信息:
Test Filters
--fgrep, -f Only run tests containing this string [string]
--grep, -g Only run tests matching this string or regexp [string]
--invert, -i Inverts --grep and --fgrep matches [boolean]
简单的方法就是运行一个单独的单元测试文件,在根文件夹里面运行终端里的命令。
npm test <fileName.test.js>
// For example
npm test utils.test.js
我还尝试了 Visual Studio 代码的 Jest Runner 扩展,效果很好。
到运行特定文件中的特定测试:
yarn test -f "partial-filename" -t "as split node"
npm test
或 jest
可以替换 yarn test
,具体取决于您喜欢的 JS 打包器。
这只会尝试在包含 some-partial-filename
的文件中查找测试,并且在这些文件中,测试需要有一个 describe
或 it
指令,其中提到“as拆分节点”,例如
// In cool-partial-filename.js
describe("with a less indented sibling", () => {
it("should create a new check-list-item with the same indent as split node", () => {
console.log("This would run with the invocation above");
})
})
如果你不想全局安装 jest,你可以使用
npx jest foo.test.js
与 package.json:
"scripts": {
"test": "jest --coverage",
"start": "node index.js"
}
以下对我有用:
npm test -f comm -- -t=first
它将找到文件名中包含 'comm' 的所有文件,并且在找到的文件中仅找到 运行 个包含 'first' 的测试。
Jest 和 Jest 运行ner 是非常有用的 VSCode 扩展,当你在玩笑时。
Jest 自动测试 运行ner
Jest Runner 在测试上方添加“运行 | 调试”代码镜头 运行 或调试单个测试。
使用这个命令:
npx jest test --runTestsByPath <path-to-file>
下面的命令对我有用。
npx jest -i file-name
无需指定文件的完整路径,文件名即可。
编辑:
找到了另一种方法来做到这一点。
npm run test:functional -i file-name
用于功能测试
npm run test:integration -i file-name
用于集成测试
使用package.json脚本
在package.json中有"scripts": { "test": "jest" }
:
npm test -- foo/__tests__/bar.spec.js
直接使用jest-cli
全局安装:
jest foo/__tests__/bar.spec.js
本地安装:
./node_modules/.bin/jest foo/__tests__/bar.spec.js
使用--testPathPattern
--testPathPattern
option has the equivalent effect of passing paths as unnamed positional arguments to jest-cli. See normalize.ts.
./node_modules/.bin/jest --testPathPattern foo/__tests__/bar.spec.js
测试两个或多个特定文件
用逗号或空格分隔文件名:
./node_modules/.bin/jest foo/__tests__/bar.spec.js,foo/__tests__/foo.spec.js
./node_modules/.bin/jest foo/__tests__/bar.spec.js foo/__tests__/foo.spec.js
多次通过--testPathPattern
:
./node_modules/.bin/jest --testPathPattern foo/__tests__/bar.spec.js --testPathPattern foo/__tests__/foo.spec.js
如果您使用 yarn
,请执行此操作
yarn test nameofthefile
例如:
yarn test file.test.js
只需使用此命令 运行 并检查特定文件的覆盖率。
yarn run test Index.js -u --coverage --watchAll=false
我可以使用 Jest 测试多个文件,但我不知道如何测试单个文件。
我有:
- 运行
npm install jest-cli --save-dev
- 已更新
package.json
:`{ ...“脚本”:{“测试”:“笑话”} ...} - 写了一些测试。
运行ning npm test
按预期工作(目前它运行 14 个测试)。
如何测试单个文件,例如测试 app/foo/__tests__/bar.spec.js
?
我已尝试 运行 npm test app/foo/__tests__/bar.spec.js
(从项目根目录),但出现以下错误:
npm ERR! Error: ENOENT, open '/node_modules/app/foo/tests/bar.spec.js/package.json'
至少从 2019 年开始:
npm test -- bar.spec.js
2015年:
为了运行 特定测试,您需要使用jest
命令。 npm test
将不起作用。要直接在命令行上访问 jest
,请通过 npm i -g jest-cli
或 yarn global add jest-cli
.
然后只需运行你的特定测试jest bar.spec.js
。
注意:您不必输入测试文件的完整路径。该参数被解释为正则表达式。唯一标识文件的完整路径的任何部分都可以。
你所要做的就是念咒语:
npm test -- SomeTestFileToRun
独立的 --
是 *nix 魔术,用于标记选项的结尾,这意味着(对于 NPM)之后的所有内容都传递给命令 运行,在这种情况下 jest
。另外,您可以通过说
npm test -- --help
总之,呗
npm test -- Foo
运行s 命名文件中的测试 (FooBar.js
)。不过,您应该注意:
Jest 将名称视为区分大小写,因此如果您使用不区分大小写但保留大小写的文件系统(如 Windows NTFS),您可能会遇到奇怪的事情。
Jest 似乎将规范视为前缀。
所以上面的咒语会
- 运行
FooBar.js
、Foo.js
和FooZilla.js
- 但是不是运行
foo.js
使用 npm test
并不意味着 Jest 是全局安装的。它只是意味着“测试”被映射到在你的 package.json
文件中使用 Jest。
以下工作,在项目的根级别:
npx jest [file or directory]
file or directory
可以是你要的测试文件运行也可以是包含多个文件的目录
要运行个人测试:
npm test -t ValidationUtil # `ValidationUtil` is my module `ValidationUtil.spec.js`
-t
- 在它后面放一个 正则表达式 包含测试名称。
如果使用Yarn,可以直接在.spec.js
或.test.js
文件后添加:
yarn test src/lib/myfile.test.js
这是我的 package.json
文件中将 Jest 安装为本地包的部分(删除了相关部分):
{
...
"scripts": {
"test": "jest",
"testw": "jest --watch",
"testc": "jest --coverage",
...
},
"devDependencies": {
"jest": "^18.1.0",
...
},
}
如果您 运行正在 npm >= 5.2.0
并且您已经在本地将 Jest 安装为 devDependencies
和 npm i -d jest
,您可以 运行 Jest 在特定的通过 npx jest /path/to/your/spec.js
.
我刚刚将 Jest 安装为全局,运行 jest myFileToTest.spec.js
,它成功了。
这就是我在不重新启动测试的情况下动态 运行 测试特定文件的方式。
我的 React 项目创建为 create-react-app
。
因此它会监视更改测试,并在我进行更改时自动 运行 测试。
这就是我在终端中看到的测试结果:
Test Suites: 16 passed, 16 total
Tests: 98 passed, 98 total
Snapshots: 0 total
Time: 5.048s
Ran all test suites.
Watch Usage: Press w to show more.
按W
Watch Usage
› Press f to run only failed tests.
› Press o to only run tests related to changed files.
› Press q to quit watch mode.
› Press p to filter by a filename regex pattern.
› Press t to filter by a test name regex pattern.
› Press Enter to trigger a test run.
然后按P
Pattern Mode Usage
› Press Esc to exit pattern mode.
› Press Enter to filter by a filenames regex pattern.
pattern ›
Start typing to filter by a filename regex pattern.
这是在我想 运行 'Login' 文件夹中的 'index.es6.js' 文件之后:
Pattern Mode Usage
› Press Esc to exit pattern mode.
› Press Enter to filter by a filenames regex pattern.
pattern › login/index
Pattern matches 1 file
› src/containers/Login/index.es6.test.js
这就是我 运行 测试特定文件的方式。
您有两个选择:
选项 1:命令行。您可以运行以下命令
node '/Users/complete-path-to-you-project/your-project/node_modules/.bin/jest' '/Users/complete-path-to-you-project/your-project/path-to-your-file-within-the-project/your-file.spec.ts'
这样可以避免全局安装 Jest。您使用您的项目使用的笑话。
选项 2:如果您使用 Visual Studio Code you have a great plugin to do this: Jest Runner。它不仅允许您 运行 一个文件一个文件地进行测试,甚至还可以通过右键单击您想要 运行.
的测试来对特定套件和规范进行测试
Jest 将使用您传递的内容作为 regular expression 模式。它将匹配。
如果您想 运行 一个特定的测试文件,那么最好的方法是使用它的精确完整路径。 (您也可以指定某个相对路径,例如 (src/XFolder/index.spec.ts)).
在目录和 Linux 中提供完整路径的最简单方法是:
jest $PWD/index.spec.ts
注意变量的使用$PWD.
为了Windows! (待更新)
您可以使用 npm test --
:
npm test -- fileName.jsx
也可以通过以下方式实现:
jest --findRelatedTests path/to/fileA.js
引用(Jest CLI Options)
如何在 Nx monorepo 中实现?这是答案(在目录 /path/to/workspace
中):
npx nx test api --findRelatedTests=apps/api/src/app/mytest.spec.ts
我们正在使用 nrwl-nx with Angular。在这种情况下我们可以使用这个命令:
npm test <ng-project> -- --testFile "file-name-part"
备注:
npm test
将 运行package.json
中指定的测试脚本:"test": "ng test"
--
:告诉 npm 将以下参数传递给测试脚本(而不是使用它们)- 因此 cmd 的其余部分将传递给 ng test
<ng-project>
是angular.json
中的项目名称- 当您省略此参数时,将使用
"defaultProject"
(在angular.json
中指定)(因此您必须指定它,当测试不在您的默认项目中时)
- 当您省略此参数时,将使用
- 接下来我们必须检查使用了哪个构建器:
- 在
angular.json
中导航至"project"
-"<ng-project>"
-"architect"
-"test"
- 并检查
"builder"
,在我们的例子中是:"@nrwl/jest:jest"
- 在
- 现在我们知道了生成器,我们需要找到可用的命令行参数
- 在命令行中,运行
npm test <ng-project> -- --help
查看所有可用选项 - 或检查online documentation
- 在命令行中,运行
- 其中一个选项是
--testFile
,这里使用
使用 Angular 和 Jest,您可以将其添加到“脚本”下的文件 package.json:
"test:debug": "node --inspect-brk ./node_modules/jest/bin/jest.js --runInBand"
然后 运行 对特定文件进行单元测试,您可以在终端中编写此命令
npm run test:debug modules/myModule/someTest.spec.ts
不需要传递完整路径。只需使用正则表达式模式即可。
yarn jest --testNamePattern my_test_name
yarn jest -t=auth
yarn jest -t component # This will test all whose test name contains `component`
yarn jest --testPathPattern filename # This will match the file path
yarn jest filename # This will match the file path, the same with above
import LoggerService from '../LoggerService ';
describe('Method called****', () => {
it('00000000', () => {
const logEvent = jest.spyOn(LoggerService, 'logEvent');
expect(logEvent).toBeDefined();
});
});
用法:
npm test -- __tests__/LoggerService.test.ts -t '00000000'
对于 NestJS 用户,简单的替代方法是使用,
npm test -t <name of the spec file to run>
NestJS 预先配置了测试文件的正则表达式,以便在 Jest 的情况下搜索。
一个简单的例子是-
npm test -t app-util.spec.ts
(这是我的 .spec 文件名)
Jest 搜索 .spec 文件时不需要给出完整的路径,NestJS 默认情况下可用的配置:
"jest": {
"moduleFileExtensions": [
"js",
"json",
"ts"
],
"rootDir": "src",
"testRegex": ".spec.ts$",
"transform": {
"^.+\.(t|j)s$": "ts-jest"
},
"coverageDirectory": "../coverage",
"testEnvironment": "node"
}
}
"测试": "是 api/ds_server/ds_server.test.js"
来自 Jest 文档:
"scripts": {
"test": "jest path/to/my-test.js"
}
运行这个和
npm run test
当时我是用:
yarn test TestFileName.spec.js
你不应该输入完整的路径。这适用于 Windows 10 机器。
如果安装 Visual Studio 代码插件 Jest 运行ner,
您将在每个 describe
和 it
上方有 Debug/运行 选项。
您可以在 Visual Studio 代码中打开您的测试文件,然后单击其中一个选项。
一个简单有效的解决方案:
yarn test -g fileName
或
npm test -g fileName
示例:
yarn test -g cancelTransaction
或
npm test -g cancelTransaction
有关测试过滤器的更多信息:
Test Filters
--fgrep, -f Only run tests containing this string [string]
--grep, -g Only run tests matching this string or regexp [string]
--invert, -i Inverts --grep and --fgrep matches [boolean]
简单的方法就是运行一个单独的单元测试文件,在根文件夹里面运行终端里的命令。
npm test <fileName.test.js>
// For example
npm test utils.test.js
我还尝试了 Visual Studio 代码的 Jest Runner 扩展,效果很好。
到运行特定文件中的特定测试:
yarn test -f "partial-filename" -t "as split node"
npm test
或 jest
可以替换 yarn test
,具体取决于您喜欢的 JS 打包器。
这只会尝试在包含 some-partial-filename
的文件中查找测试,并且在这些文件中,测试需要有一个 describe
或 it
指令,其中提到“as拆分节点”,例如
// In cool-partial-filename.js
describe("with a less indented sibling", () => {
it("should create a new check-list-item with the same indent as split node", () => {
console.log("This would run with the invocation above");
})
})
如果你不想全局安装 jest,你可以使用
npx jest foo.test.js
与 package.json:
"scripts": {
"test": "jest --coverage",
"start": "node index.js"
}
以下对我有用:
npm test -f comm -- -t=first
它将找到文件名中包含 'comm' 的所有文件,并且在找到的文件中仅找到 运行 个包含 'first' 的测试。
Jest 和 Jest 运行ner 是非常有用的 VSCode 扩展,当你在玩笑时。
Jest 自动测试 运行ner
Jest Runner 在测试上方添加“运行 | 调试”代码镜头 运行 或调试单个测试。
使用这个命令:
npx jest test --runTestsByPath <path-to-file>
下面的命令对我有用。
npx jest -i file-name
无需指定文件的完整路径,文件名即可。
编辑:
找到了另一种方法来做到这一点。
npm run test:functional -i file-name
用于功能测试
npm run test:integration -i file-name
用于集成测试
使用package.json脚本
在package.json中有"scripts": { "test": "jest" }
:
npm test -- foo/__tests__/bar.spec.js
直接使用jest-cli
全局安装:
jest foo/__tests__/bar.spec.js
本地安装:
./node_modules/.bin/jest foo/__tests__/bar.spec.js
使用--testPathPattern
--testPathPattern
option has the equivalent effect of passing paths as unnamed positional arguments to jest-cli. See normalize.ts.
./node_modules/.bin/jest --testPathPattern foo/__tests__/bar.spec.js
测试两个或多个特定文件
用逗号或空格分隔文件名:
./node_modules/.bin/jest foo/__tests__/bar.spec.js,foo/__tests__/foo.spec.js
./node_modules/.bin/jest foo/__tests__/bar.spec.js foo/__tests__/foo.spec.js
多次通过--testPathPattern
:
./node_modules/.bin/jest --testPathPattern foo/__tests__/bar.spec.js --testPathPattern foo/__tests__/foo.spec.js
如果您使用 yarn
,请执行此操作yarn test nameofthefile
例如:
yarn test file.test.js
只需使用此命令 运行 并检查特定文件的覆盖率。
yarn run test Index.js -u --coverage --watchAll=false