Отключить fdescribe() и fit() Жасмин в зависимости от среды

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

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

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


person Guy    schedule 08.07.2015    source источник
comment
no-focused-tests так часто спасал меня раньше :). Как насчет чего-то вроде хука перед слиянием? (stackoverflow.com/questions/19102714/)   -  person alecxe    schedule 11.07.2015
comment
К сожалению, слияние происходит на GitHub, поэтому, если его нельзя запустить, как правило, на серверах GitHub, я не думаю, что это сработает. Хотя за идею спасибо! +1   -  person Guy    schedule 11.07.2015
comment
Я запускаю jshint как часть моей сборки, он улавливает такие вещи.   -  person sam schonstal    schedule 17.01.2016


Ответы (6)


Было бы нормально использовать что-то вроде тестов без фокуса. Любая идея, как включить это правило как ошибку в 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 (включается после того, как jasmine определяет свои глобальные переменные):

    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 запускать npm run test-safe вместо npm run test

person Alan    schedule 27.04.2016

Редактировать 14.11.19:

Чтобы упростить задачу, я создал устанавливаемый пакет, который вы можете найти по адресу https://www.npmjs.com/package/tslint-jasmine

Исходное сообщение:

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

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

  1. Сохраните Gist в папке с именем TSLint/Rules как noJasmineFocusRule.js
  2. Добавьте папку Rules в конфигурацию TSLint: rulesDirectory: 'TSLint/Rules'
  3. Включить опцию с помощью "no-jasmine-focus": true
person Dominik Ehrenberg    schedule 18.07.2018
comment
Это элегантный способ сделать это. Спасибо. - person ibenjelloun; 21.02.2019
comment
Это отлично работает с хуком предварительной отправки Husky, чтобы fdescribe или fit не ограничивали автоматические тесты конвейера развертывания. например пакет.json "husky": { "hooks": { "pre-push": "ng lint && ng test --watch=false --browsers=ChromeHeadless" } } - person Andrew; 19.03.2019

Для тех, кто заинтересован, если вы используете 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

person TheNastyOne    schedule 06.09.2016

Это не лучшее решение. Но для моих нужд работает.

Установить:

npm i lodash
npm i minimist

Я вызываю это из своих задач gulp:

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;
};
person Jesus is Lord    schedule 07.09.2018

Я опаздываю на вечеринку.

У меня была аналогичная проблема с моими сборками. Мы не используем ts/eslint, поэтому я просто написал быстрый скрипт, чтобы выдать ошибку, которая приведет к сбою моего dockerfile/build.

Вот.

#!/bin/sh
files=$(find "./.." -type f -name '*.spec*')
errored=false

echo "Checking for focused tests"

for file in $files
do
    if grep -E "fdescribe|fit" $file; [ $? -eq 0 ]; then
        echo "-Focusing a test in the file $file"
        errored=true
    fi
done

if $errored; then
    echo "Some tests were focused"
    exit 1
else
    echo "No tests were focused"
fi
person Questioning    schedule 17.01.2020

Если вы готовы потерпеть неудачу, когда тесты помечены для фокуса или пропустить (fit + xit), есть относительно новая функция Karma, которая решает проблему без плагинов. Теперь Karma поддерживает параметр failOnSkippedTests файла конфигурации/командной строки, который, согласно в документах, вызывает сбой при намеренно отключенных тестах, например, fit() или xit().

person Coderer    schedule 04.11.2020