Отключить 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

Как пользоваться:

  1. Сохраните Gist в папке с именем TSLint/Rules как noJasmineFocusRule.js
  2. Добавьте папку Rules в вашу конфигурацию rulesDirectory: 'TSLint/Rules'
  3. Включить параметр с "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