jest: запуск тестов с покрытием в pre-commit-hook завершается с 1, если покрытие не найдено

Я пытаюсь запустить тесты на подготовленных файлах в хуке перед фиксацией с помощью шутки. Все идет нормально. Получил работу с пакетами pre-commit и lint-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": ["<rootDir>/src/models/"], шутка завершается с 1, поэтому нет фиксации. Нашел способ обойти это, добавив --passWithNoTests. Отлично. Но теперь я также хочу проверить покрытие — и это тоже не работает, когда нет тестов (и, следовательно, нет данных о покрытии):

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

            Jest: Coverage data for global was not found.

Есть ли другой флаг, который я мог бы использовать, чтобы также игнорировать это для покрытия (например, --passWithNoTests для реальных тестов)? Или кто-то лучше знает, как это сделать?

Или мне следует пропустить покрытие для этих предварительных тестов?


person Philipp Kyeck    schedule 19.01.2018    source источник
comment
Провести все тесты? Не уверен, что вы все равно можете сделать свои пороги относительно поставленных файлов.   -  person Gabriel Bleu    schedule 19.01.2018
comment
@GabrielBleu Я думал о том, чтобы спрятать, а затем запустить все тесты. Но затем нашел статью, в которой упоминается lint-staged, который может обрабатывать промежуточные файлы ... может быть, это слишком сложно. Запуск всего теста и включение измененных, но не промежуточных файлов может дать неправильный результат, где он должен отражать точные тесты, которые будут выполняться в CI после отправки.   -  person Philipp Kyeck    schedule 20.01.2018


Ответы (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 --fix и prettier --write.

person Chukwuma Nwaugha    schedule 31.07.2020