如何使用 Jest 测试单个文件?

How do I test a single file using Jest?

我可以使用 Jest 测试多个文件,但我不知道如何测试单个文件。

我有:

运行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-cliyarn 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.jsFoo.jsFooZilla.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 安装为 devDependenciesnpm 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

参考和更多信息:How to test a single Jest test file in Nx #6

我们正在使用 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

不需要传递完整路径。只需使用正则表达式模式即可。

参见--testLocationInResults

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,

您将在每个 describeit 上方有 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 testjest 可以替换 yarn test,具体取决于您喜欢的 JS 打包器。

这只会尝试在包含 some-partial-filename 的文件中查找测试,并且在这些文件中,测试需要有一个 describeit 指令,其中提到“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