Отключите функции Fdescribe() и fit () Jasmine в зависимости от среды



fdescribe() и fit() отлично подходят для уменьшения шума, когда вы работаете над подмножеством тестов. Я иногда забываю поменять их обратно на describe()/it() перед слиянием моей ветви с мастером. (Это нормально, чтобы иметь их в отдельной ветви во время работы над кодом - то есть предварительная проверка фиксации не будет работать для меня.)



Моя среда CI-это Codeship. Есть ли решение этой проблемы, которое провалило бы тесты в Codeship, если бы оно столкнулось с какими-либо сфокусированными методами?



Используя что-то вроде не-сфокусированные-тесты были бы в порядке. Есть идеи, как включить это правило как ошибку в Codeship и отключить его локально?

689   4  

4 ответов:

Использование чего-то вроде не-сфокусированных-тестов было бы нормально. Есть идеи, как включить это правило как ошибку в Codeship и отключить его локально?

Можно использовать комбинацию переменных окружения и переопределение глобальных функций fdescribe / fit:

  1. npm i --save cross-env

  2. Пакет.json:

    "scripts": {
      "test": "jasmine",
      "test-safe": "cross-env FOCUSED_TESTS=off jasmine"
    },
    
  3. 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");
    }
    
  4. Расскажи codeship to run npm run test-safe вместо npm run test

Для тех, кто заинтересован, если вы используете jasmine и eslint, вы можете использовать этот плагин, чтобы гарантировать отсутствие целенаправленных тестов: https://github.com/tlvince/eslint-plugin-jasmine .

  1. Сначала установите eslint глобально npm install -g eslint.
  2. затем установите библиотеку eslint-plugin-jasmine npm install --save-dev eslint-plugin-jasmine.
  3. Создайте файл .eslintrc, который будет выглядеть примерно так:

    {
      "rules": {
        "semi": 2
      },
      "plugins": ["jasmine"],
      "env": {
        "jasmine": true
      },
      "extends": "plugin:jasmine/recommended",
    }
    
  4. Тогда вы готовы запустить Линтер eslint -c ./.eslintrc app.js

Если вы используете TSLint и (как и я) обнаружили, что все шашки расфокусировки и tslint-jasmine-noSkipOrFocus не работают для вас, я создал суть для этого: https://gist.github.com/djungowski/7d9126bb79970446b4ffeb5656c6bf1f

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

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

    Ничего не найдено.