Отключить jasmine fdescribe() и fit() на основе среды
fdescribe()
и fit()
отлично подходят для уменьшения шума, когда вы работаете над подмножеством тестов. Иногда я забываю изменить их на describe()
/it()
, прежде чем слить свою ветку в мастер. (Хорошо, чтобы они были в отдельной ветке во время работы над кодом - т.е. Проверка для предварительной фиксации не сработала бы для меня.)
Моя среда CI - это Codeship. Есть ли решение этой проблемы, которая не завершила бы тесты в Codeship, если бы она натолкнулась на любые сфокусированные методы?
Используя что-то вроде no-focused-tests, все будет в порядке. Любая идея, как включить это правило в качестве ошибки в Codeship и отключить его локально?
Ответы
Ответ 1
Использование чего-то вроде не-сфокусированных тестов было бы в порядке. Любая идея, как включить это правило в качестве ошибки в Codeship и отключить его локально?
Вы можете использовать комбинацию переменных среды и переопределить глобальные функции fdescribe/fit:
-
npm i --save cross-env
-
package.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");
}
-
Скажите кодам для запуска npm run test-safe
вместо npm run test
Ответ 2
Для тех, кто интересуется, если вы используете 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",
}
-
Затем вы готовы запустить linter eslint -c ./.eslintrc app.js
Ответ 3
Если вы используете TSLint и (как я) обнаружили, что все шашки defocus и tslint-jasmine-noSkipOrFocus у вас не работают, я создал для этого Gist: https://gist.github.com/djungowski/7d9126bb79970446b4ffeb5656c6bf1f
Как пользоваться:
- Сохраните Gist в папке с именем
TSLint/Rules
как noJasmineFocusRule.js
- Добавьте папку Rules в вашу конфигурацию
rulesDirectory: 'TSLint/Rules'
- Включить параметр с
"no-jasmine-focus": true
Ответ 4
Это не лучшее решение. Но это работает для моих нужд.
Установить:
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;
};
Ответ 5
Предложение Алана не проходит тесты или оно их пропускает? Я хочу, чтобы эти тесты провалились
-
Вы можете использовать комбинацию переменных окружения и переопределить глобальные функции fdescribe/fit:
npm я --save перекрестное env
package.json:
"scripts": {"test": "jasmine", "test-safe": "cross-env FOCUSED_TESTS = off jasmine"}, disableFocusedTestsIfNeeded.js (включается после того, как jasmine определяет его глобальные переменные):
if (process.env.FOCUSED_TESTS === "off") {console.log("Целевые тесты должны быть выключены"); global.fdescribe = global.fit = function() { throw new Error("fdescribe and fit are disabled in this environment"); global.fdescribe = global.fit = function() {throw new Error ("fdescribe и fit отключены в этой среде"); }; }; } else {console.log("Фокусные тесты включены"); } Tell codeship to run npm run test-safe instead of npm run test } Сообщите кодировщику запустить npm run test-safe вместо npm run test