【问题标题】:jest: running tests with coverage in pre-commit-hook exits with 1 if no coverage was found开玩笑:如果未找到覆盖范围,则在 pre-commit-hook 中运行覆盖范围的测试以 1 退出
【发布时间】:2018-01-19 16:43:33
【问题描述】:

我正在尝试在预提交挂钩中对暂存文件运行测试。到现在为止还挺好。可以使用 pre-commitlint-staged NPM 包。

来自 package.json 的片段:

{
  // ...
  "scripts": {
    "hook": "lint-staged",
    // ...
  },
  "devDependencies": {
    "eslint": "^4.12.1",
    "eslint-config-airbnb-base": "^12.1.0",
    "eslint-config-prettier": "^2.9.0",
    "eslint-plugin-import": "^2.8.0",
    "eslint-plugin-prettier": "^2.3.1",
    "jest": "^22.0.3",
    "jest-junit": "^3.4.0",
    "lint-staged": "^6.0.1",
    "pre-commit": "^1.2.2",
    "prettier": "^1.9.1"
  },
  "jest": {
    "collectCoverageFrom": ["src/**/*.js"],
    "coveragePathIgnorePatterns": ["<rootDir>/src/models/"],
    "coverageThreshold": {
      "global": {
        "branches": 80,
        "functions": 80,
        "lines": 80,
        "statements": 80
      }
    }
  },
  "pre-commit": ["hook"],
  "lint-staged": {
    "*.js": ["eslint --fix", "git add", "jest --bail --passWithNoTests --coverage"]
  },
  // ...
}

还有更多内容,但我认为这些是重要的部分。

我遇到的问题是,如果我暂存没有任何测试或被 "coveragePathIgnorePatterns": ["&lt;rootDir&gt;/src/models/"] 的 b/c 忽略的文件,则 jest 以 1 退出 - 所以没有提交。通过添加--passWithNoTests 找到了解决方法。伟大的。但现在我还想检查覆盖率 - 当没有测试(因此没有覆盖率数据)时,这也会失败:

----------|----------|----------|----------|----------|----------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines |Uncovered Lines |
----------|----------|----------|----------|----------|----------------|
All files |  Unknown |  Unknown |  Unknown |  Unknown |                |
----------|----------|----------|----------|----------|----------------|

            Jest: Coverage data for global was not found.

我是否可以使用另一个标志来忽略它的覆盖范围(例如--passWithNoTests 用于实际测试)?或者有人有更好的想法如何做到这一点?

或者我应该跳过这些预提交测试的覆盖范围吗?

【问题讨论】:

  • 运行所有测试?不确定您是否可以设置相对于暂存文件的阈值。
  • @GabrielBleu 我考虑过存储然后运行所有测试。但是后来发现一篇文章提到了可以处理暂存文件的lint-staged……也许这太复杂了。运行所有测试并包含已更改但未暂存的文件可能会给您一个错误的结果 - 它应该反映在推送后将在 CI 上运行的确切测试。

标签: javascript node.js git jestjs pre-commit-hook


【解决方案1】:

你可以使用husky和lint-staged来分解,如下图:

 "lint-staged": {
    "src/**/*.(spec|test).ts": [
      "npm run test"
    ],
    "src/**/*.{ts,vue}": [
      "eslint --fix",
      "prettier --write"
    ]
  },
  "husky": {
    "hooks": {
      "pre-commit": "lint-staged"
    }
  },

这样,如果测试目录中没有暂存文件,它会跳过测试并转到下一项,即eslint --fixprettier --write

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 2022-06-12
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多