24

fdescribe()并且fit()非常适合在您进行部分测试时降低噪音。在将我的分支合并到 master 之前,我有时会忘记将它们改回describe()/ 。it()(在处理代码时可以将它们放在单独的分支中 - 即预提交检查对我不起作用。)

我的 CI 环境是 Codeship。如果遇到任何有针对性的方法,是否有解决此问题的方法会使 Codeship 中的测试失败?

使用诸如no-focused-tests之类的东西是可以的。知道如何在 Codeship 中启用此规则作为错误并在本地禁用它吗?

4

6 回答 6

6

编辑 14.11.19

为了让事情变得更容易,我创建了一个可安装包,您可以在https://www.npmjs.com/package/tslint-jasmine找到

原帖

如果您正在使用 TSLint 并且(像我一样)发现所有的散焦和 tslint-jasmine-noSkipOrFocus 检查器都不适合您,我为此创建了一个要点:https ://gist.github.com/djungowski/7d9126bb79970446b4ffeb5656c6bf1f

如何使用:

  1. 将 Gist 保存在TSLint/Rules名为noJasmineFocusRule.js
  2. 将规则文件夹添加到您的 TSLint 配置中:rulesDirectory: 'TSLint/Rules'
  3. 启用选项"no-jasmine-focus": true
于 2018-07-18T13:47:24.020 回答
4

使用诸如 no-focused-tests 之类的东西是可以的。知道如何在 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

于 2016-04-27T06:32:53.647 回答
3

对于那些感兴趣的人,如果你使用 jasmine 和 eslint,你可以使用这个插件来确保没有集中测试:https ://github.com/tlvence/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. 然后你准备好运行 lintereslint -c ./.eslintrc app.js

于 2016-09-06T21:11:22.427 回答
1

我参加晚会迟到了。

我的构建也有类似的问题。我们不使用 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
于 2020-01-17T14:56:40.120 回答
0

这不是最好的解决方案。但它适用于我的需要。

建立:

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;
};
于 2018-09-07T00:28:16.323 回答
0

如果您愿意在测试标记为焦点跳过 ( fit+ xit) 时失败,那么有一个相对较新的 Karma 功能可以在没有插件的情况下解决问题。Karma 现在支持failOnSkippedTests配置文件/CLI 选项,根据文档,该选项会导致“故意禁用的测试失败,例如 fit() 或 xit()”。

于 2020-11-04T16:51:05.377 回答