【问题标题】:Disable Jasmine's fdescribe() and fit() based on environment根据环境禁用 Jasmine 的 fdescribe() 和 fit()
【发布时间】:2015-09-27 01:24:48
【问题描述】:

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

我的 CI 环境是 Codeship。如果遇到任何专注的方法,是否有解决方案会导致 Codeship 中的测试失败?

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

【问题讨论】:

  • no-focused-tests 以前经常救我:)。像预合并钩子这样的东西怎么样? (stackoverflow.com/questions/19102714/…)
  • 不幸的是,合并发生在 GitHub 上,所以除非它可以作为 GitHub 服务器上的规则触发,否则我认为这不会起作用。不过谢谢你的主意! +1
  • 我在构建过程中运行 jshint,它可以捕获这类事情。

标签: javascript node.js jasmine codeship


【解决方案1】:

编辑 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. 将规则文件夹添加到您的 TSLint 配置中:rulesDirectory: 'TSLint/Rules'
  3. 使用"no-jasmine-focus": true 启用选项

【讨论】:

  • 这是一种优雅的做法。谢谢。
  • 这与 husky "pre-push" 挂钩非常有用,可以防止 fdescribefit 限制您的部署管道自动化测试。例如package.json "husky": { "hooks": { "pre-push": "ng lint && ng test --watch=false --browsers=ChromeHeadless" } }
【解决方案2】:

使用类似 no-focused-tests 是可以的。知道如何在 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. 告诉 codeship 运行 npm run test-safe 而不是 npm run test

【讨论】:

    【解决方案3】:

    对于那些感兴趣的人,如果你正在使用 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

    【讨论】:

      【解决方案4】:

      我迟到了。

      我的构建也有类似的问题。我们不使用 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】:

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

        设置:

        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;
        };
        

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-09-10
            • 2021-11-25
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多