Отключите функции Fdescribe() и fit () Jasmine в зависимости от среды
fdescribe() и fit() отлично подходят для уменьшения шума, когда вы работаете над подмножеством тестов. Я иногда забываю поменять их обратно на describe()/it() перед слиянием моей ветви с мастером. (Это нормально, чтобы иметь их в отдельной ветви во время работы над кодом - то есть предварительная проверка фиксации не будет работать для меня.)
Моя среда CI-это Codeship. Есть ли решение этой проблемы, которое провалило бы тесты в Codeship, если бы оно столкнулось с какими-либо сфокусированными методами?
Используя что-то вроде не-сфокусированные-тесты были бы в порядке. Есть идеи, как включить это правило как ошибку в Codeship и отключить его локально?
4 ответов:
Использование чего-то вроде не-сфокусированных-тестов было бы нормально. Есть идеи, как включить это правило как ошибку в Codeship и отключить его локально?
Можно использовать комбинацию переменных окружения и переопределение глобальных функций fdescribe / fit:
npm i --save cross-envПакет.json:
"scripts": { "test": "jasmine", "test-safe": "cross-env FOCUSED_TESTS=off jasmine" },DisableFocusedTestsIfNecessary.js (включенный после Жасмин определяет его глобалы):
if (process.env.FOCUSED_TESTS === "off") { console.log("Focused tests must be off"); global.fdescribe = global.fit = function() { throw new Error("fdescribe and fit are disabled in this environment"); }; } else { console.log("Focused tests enabled"); }Расскажи codeship to run
npm run test-safeвместоnpm run test
Для тех, кто заинтересован, если вы используете jasmine и eslint, вы можете использовать этот плагин, чтобы гарантировать отсутствие целенаправленных тестов: https://github.com/tlvince/eslint-plugin-jasmine .
- Сначала установите eslint глобально
npm install -g eslint.- затем установите библиотеку eslint-plugin-jasmine
npm install --save-dev eslint-plugin-jasmine.Создайте файл
.eslintrc, который будет выглядеть примерно так:{ "rules": { "semi": 2 }, "plugins": ["jasmine"], "env": { "jasmine": true }, "extends": "plugin:jasmine/recommended", }Тогда вы готовы запустить Линтер
eslint -c ./.eslintrc app.js
Если вы используете TSLint и (как и я) обнаружили, что все шашки расфокусировки и tslint-jasmine-noSkipOrFocus не работают для вас, я создал суть для этого: https://gist.github.com/djungowski/7d9126bb79970446b4ffeb5656c6bf1f
Как использовать:
- сохраните Gist в папке с именем
TSLint/RulesкакnoJasmineFocusRule.js- добавьте папку Rules в конфигурацию TSLint:
rulesDirectory: 'TSLint/Rules'- включить опцию с помощью
"no-jasmine-focus": true
Это не самое лучшее решение. Но это работает для моих нужд.
Для настройки:
npm i lodash npm i minimistЯ называю это из моих задач глотка:
node .\\build\\throwIfFocusedTest.js e2e/ node .\\build\\throwIfFocusedTest.js src/ThrowIfFocusedTest.js:
const walkSync = require('./walkSync').default; const _ = require('lodash'); const argv = require('minimist')(process.argv); const fs = require('fs'); if (argv._.length !== 3) { throw 'expecting 1 command line argument'; } const directory = argv._[2]; const files = walkSync(directory); const scriptFiles = _.filter(files, f => f.endsWith('.js') || f.endsWith('.ts')); const invalidStrings = [ 'fdescribe', 'fit', ]; _.each(scriptFiles, fileName => { const contents = fs.readFileSync(fileName, 'utf8'); invalidStrings.forEach(is => { if (contents.includes(is)) { console.error(`throwIfFocusedTest: ${directory}: File contains ${is}: ${fileName}`); process.exit(1); } }); }); console.log(`throwIfFocusedTest: ${directory}: No files contain: ${invalidStrings.join(', ')}`);WalkSync.js:
/** * From: https://gist.github.com/kethinov/6658166 */ exports.default = function walkSync(dir, filelist) { var fs = fs || require('fs'), files = fs.readdirSync(dir); filelist = filelist || []; files.forEach(function (file) { var path = dir + file; if (fs.statSync(dir + file).isDirectory()) { filelist = walkSync(dir + file + '/', filelist); } else { filelist.push(path); } }); return filelist; };
Comments