Итак, вам нужно более быстрое решение для выбора тестов, которые нужно включить или исключить при запуске mocha? Это должно сэкономить вам много кликов, щелчков и нажатий клавиш, когда вы хотите отфильтровать большое количество загромождающих модульных тестов.

Помимо чая и мокко, шпионов, заглушек и насмешек, вот что вам понадобится:

npm install --save-dev npm-run-all
npm install --save-dev filehound
touch test/bin/rename-selected-spec-files.js
touch test/tests-to-run.js
  • npm-run-all — это простой пакет для запуска нескольких сценариев npm.
  • filehound — это полезный пакет для рекурсивного поиска в структуре каталогов [пути/к/именам файлов.и.расширениям].

rename-selected-spec-files.js будет нашим файлом скрипта.

tests-to-run.js будет нашим массивом конфигурации.

Сначала запустите rename-selected-spec-files.js, включив следующие значения в файл package.json:

"scripts": {
  "test": "npm-run-all select-tests test-run",
  "select-tests": "node test/bin/rename-selected-spec-files.js",
  "test-run": "mocha --require babel-core/register \"app/**/*.spec.js\" || true",
},

Замените значение «test-run» выше своей пользовательской командой mocha. (Этот пример написан для мокко-теста, которому требуется макет DOM для тестирования React и фиктивный магазин для тестирования Redux.) Единственная важная спецификация, которую следует учитывать, заключается в том, что все мокко-тесты должны называться name-of-test. spec.js, если вы не хотите его изменить.

Теперь npm run select-tests запустит предстоящий файл сценария. npm run test-runзапустит тесты мокко. npm run test запустит оба скрипта: сначала первый, а затем второй.

Добавьте console.log(‘console.logged’) в rename-selected-spec-files.js, чтобы проверить выполнение.

tests-to-run.js должен выглядеть так:

module.exports = [
  'app/test1',
  'app/test2',
  // 'app/components/specs/test3'
  ];

Этот файл будет содержать пути к вашим файлам спецификаций в виде строк в массиве. Обратите внимание на отсутствие расширений файлов, а также закомментированный путь. В этом сценарии при выполнении mocha будут включены только первые два файла спецификаций.

rename-selected-spec-files.js переименует расширения вашего файла спецификаций в соответствии с их включением в импортированный файл конфигурации tests-to-run.js. Другими словами, после выполнения rename-selected-spec-files.js ваши файлы будут переименованы:

app/test1.spec.js
app/test2.spec.js
app/components/specs/test3.spec.disabled.js

И это будет включать или исключать файлы спецификаций при запуске mocha.

И, наконец, файл rename-selected-spec-files.js:

var fs = require('fs');
var FileHound = require('filehound');
var testsToRun = require('../tests-to-run.js');
const trim = (fn) => fn.substring(0, fn.indexOf('.'));
const jsFiles = FileHound.create()
  .paths(['./test', './app'])
  .ext('js')
  .find();
jsFiles.then((pathsArr) => {
  let specFiles = pathsArr.filter((filePath) => filePath.includes(".spec.js") || filePath.includes(".spec.disabled.js"));
  let pathsToEnable = specFiles.filter((fileName) => testsToRun.includes(trim(fileName)) && fileName.includes("disabled"));
  let pathsToDisable = specFiles.filter((fileName) => !testsToRun.includes(trim(fileName)) && !fileName.includes("disabled"));
  pathsToEnable.forEach((oldName) => {
    let newName = `${trim(oldName)}.spec.js`;
    fs.rename(oldName, newName, (err) => {
      if (err) {console.log(err); return;}
    });
  });
  pathsToDisable.forEach((oldName) => {
    let newName = `${trim(oldName)}.spec.disabled.js`;
    fs.rename(oldName, newName, (err) => {
      if (err) {console.log(err); return;}
    });
  });
});

Ниже приведена более подробная версия для копирования, вставки и изучения:

/*
 This script finds all .spec.js files and renames them .spec.disabled.js according to their presence in tests-to-run.js
 */
var fs = require('fs');
var FileHound = require('filehound');
var testsToRun = require('../tests-to-run.js');
// a function to remove the extensions from a path and filename
const trim = (fileNameWithExt) => fileNameWithExt.substring(0, fileNameWithExt.indexOf('.'));
// find all .js files
const jsFilePathsPromise = FileHound.create()
  .paths(['./test', './app'])
  .ext('js')
  .find();
// use the resulting array of paths
jsFilePathsPromise.then((jsFilePathsArr) => {
  let specFileNames = jsFilePathsArr.filter((filePath) => filePath.includes(".spec.js") || filePath.includes(".spec.disabled.js"));
console.log('*********');
console.log("testToInclude", testsToRun.length);
console.log(testsToRun);
console.log("spec file names", specFileNames.length);
console.log(specFileNames);
let pathsToEnable = specFileNames.filter((fileName) => testsToRun.includes(trim(fileName)) && fileName.includes("disabled"));
console.log("files to enable", pathsToEnable.length);
console.log(pathsToEnable);
let pathsToDisable = specFileNames.filter((fileName) => !testsToRun.includes(trim(fileName)) && !fileName.includes("disabled"));
console.log("files to disable", pathsToDisable.length);
console.log(pathsToDisable);
  pathsToEnable.forEach((oldFileName) => {
    let newFileName = `${trim(oldFileName)}.spec.js`;
    fs.rename(oldFileName, newFileName, (err) => {
      if (err) {console.log(err); return;}
      console.log(`Renamed ${newFileName}`)
    });
  });
  pathsToDisable.forEach((oldFileName) => {
    let newFileName = `${trim(oldFileName)}.spec.disabled.js`;
    fs.rename(oldFileName, newFileName, (err) => {
      if (err) {console.log(err); return;}
      console.log(`Renamed ${newFileName}`)
    });
  });
});