根据环境

时间:2015-07-08 21:49:44

标签: javascript node.js jasmine codeship

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

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

使用像no-focused-tests这样的东西就行了。知道如何在Codeship中将此规则作为错误启用并在本地禁用它吗?

6 个答案:

答案 0 :(得分:3)

  

使用无焦点测试之类的东西是可以的。知道如何在Codeship中将此规则作为错误启用并在本地禁用它吗?

您可以使用环境变量的组合并重新定义fdescribe / fit全局函数:

  1. npm i --save cross-env

  2. 的package.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. 告诉代码运行npm run test-safe代替npm run test

答案 1 :(得分:2)

对于那些感兴趣的人,如果你使用的是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. 然后您就可以运行linter eslint -c ./.eslintrc app.js

答案 2 :(得分:2)

如果您使用的是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启用选项

答案 3 :(得分:0)

这不是最佳解决方案。但这可以满足我的需求。

要设置:

public static ulong GetWhitelisted(string key)
{
    if (whitelisted.ContainsKey(MinecraftClient.ChatBots.WeeWoo.username))
    {
        ulong userWhiteListId;

        if (UInt64.TryParse(key, out userWhiteListId))
        {
            // If parsing succeeded, return the value
            return userWhiteListId;
        }

        // Optionally, return some other value if the user was found but parsing failed
        // return -1;
    }

    // Either the user wasn't found or the parsing failed
    return 0;
}

我从吞吃任务中称其为

npm i lodash
npm i minimist

throwIfFocusedTest.js:

node .\\build\\throwIfFocusedTest.js e2e/
node .\\build\\throwIfFocusedTest.js src/

walkSync.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(', ')}`);

答案 4 :(得分:0)

我迟到了。

我的作品也有类似的问题。我们不使用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

答案 5 :(得分:0)

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