Итак, вам нужно более быстрое решение для выбора тестов, которые нужно включить или исключить при запуске 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}`) }); }); });