【问题标题】:Mocha tests with extra options or parameters带有额外选项或参数的 Mocha 测试
【发布时间】:2013-04-15 04:45:28
【问题描述】:

我正在使用 Mocha 为我的 Node.js 应用程序编写测试用例。测试用例需要一个 API 密钥作为额外的输入选项或参数。 API 密钥是私有的,所以我不想将它直接包含在测试文件中,因为每个人都可以在 GitHub 上看到它。我知道 Mocha 有一些可用的选项:

http://mochajs.org/#usage

但是是否可以包含一些参数让测试人员在命令行中为测试指定自己的 API 密钥?如:

./node_modules/mocha/bin/mocha test/*.js --key YOUR_KEY

【问题讨论】:

    标签: node.js mocha.js


    【解决方案1】:

    我认为 Mocha 本身不支持将额外参数传递给您的测试,但您可以使用环境变量:

    env KEY=YOUR_KEY mocha test/*.js # assumes some sort of Unix-type OS.
    

    并在您的测试文件中阅读它们:

    var key = process.env.KEY;
    

    【讨论】:

    • 对于多个参数env KEY1=YOUR_KEY1 KEY2=YOUR_KEY2 mocha test
    • 2017 年现在可以了,请看下面我的回答
    • @danday74 问题在于不共享敏感信息。我看不出您的解决方案是如何解决这个问题的,因为这意味着某些文件仍然无法签入。使用在命令行上传递的环境变量可以避免这样做。
    【解决方案2】:

    看看 Substack 的 optimist 模块和 flatiron 的 nconf。我的很多测试都依赖于外部参数,而 optimist 和 nconf 模块可以轻松地从 json 文件加载配置选项

    在您的测试命令中传递 config.json 文件的路径

    测试命令

    mocha test/api-test.js --config=/path/to/config.json --reporter spec
    

    api-test.js

    var path = require('path')
    var fs = require('fs')
    var assert = require('assert')
    var argv = require('optimist').demand('config').argv
    var configFilePath = argv.config
    assert.ok(fs.existsSync(configFilePath), 'config file not found at path: ' + configFilePath)
    var config = require('nconf').env().argv().file({file: configFilePath})
    var apiConfig = config.get('api')
    var apiKey = apiConfig.key
    

    config.json

    {
      "api": {
        "key": "fooKey",
        "host": "example.com",
        "port": 9000
      }
    }
    

    另类

    我最近使用的另一种模式是config 模块。您可以指定./config/default.yml 文件用于定期运行,并指定./config/test.yml 文件用于测试。

    在运行您的测试套件时,导出 NODE_ENV=test 并且配置模块将加载 test.yml

    在您的代码中很容易访问配置对象

    var config = require('config')
    
    // config now contains your actual configuration values as determined by the process.env.NODE_ENV
    var apiKey = config.api.key
    

    设置 NODE_ENV=test 的一种简单方法是使用 makefile 运行测试。通过make test 运行所有测试。要运行单个测试,请执行 make one NAME=test/unit/sample-test.js

    生成文件示例

    MOCHA?=node_modules/.bin/mocha
    REPORTER?=spec
    GROWL?=--growl
    FLAGS=$(GROWL) --reporter $(REPORTER) --colors --bail
    
    test:
            @NODE_ENV="test" \
            $(MOCHA) $(shell find test -name "*-test.js") $(FLAGS)
    
    one:
            @NODE_ENV="test" \
            $(MOCHA) $(NAME) $(FLAGS)
    
    unit:
            @NODE_ENV="test" \
            $(MOCHA) $(shell find test/unit -name "*-test.js") $(FLAGS)
    
    integration:
            @NODE_ENV="test" \
            $(MOCHA) $(shell find test/integration -name "*-test.js") $(FLAGS)
    
    acceptance:
            @NODE_ENV="test" \
            $(MOCHA) $(shell find test/acceptance -name "*-test.js") $(FLAGS)
    
    .PHONY: test
    

    【讨论】:

      【解决方案3】:

      传递类似于此线程中提到的 process.argv[index] 方法的参数的最简单方法之一是使用 npm 配置变量。这使您可以更清楚地看到变量名称:

      测试命令:

      npm --somevariable=myvalue run mytest
      

      package.json:

      "scripts": {
      "mytest": "mocha ./test.js" }
      

      test.js

      console.log(process.env.npm_config_somevariable) // should evaluate to "myvalue"
      

      【讨论】:

      • 这个解决方案看起来相当不错,因为它使用了 npm 工具。你能评论一下如何从命令行传递多个参数吗?
      • @roman:你试过npm ---somevar=myval --anothervar = anotherVal run mytestprocess.env.npm_config_somevarprocess.env.npm_config_anothervar吗?
      【解决方案4】:

      其他答案的局限性在于它们不支持在运行测试套件之前执行代码。它们只支持传递参数。

      此答案支持在执行您的测试套件之前执行代码,并由 mocha 完整记录

      mocha 文档:http://unitjs.com/guide/mocha.html#mocha-opts

      创建 ./test/mocha.opts

      --recursive
      --reporter spec
      --require ./server.bootstrap
      --require ./test/test.bootstrap
      

      创建 ./server.bootstrap.js

      global.appRoot = require('app-root-path');
      // any more server init code
      

      创建 ./test/test.bootstrap.js

      process.env.NODE_ENV='test';
      // any more test specific init code
      

      终于在你的 server.js 中:

      require('./server.bootstrap');
      

      完成!

      服务器引导程序中的代码将在测试和服务器执行之前执行(npm start 和 npm test)

      测试引导中的代码只会在测试之前执行(npm test)

      感谢@damianfabian 提供这个 - 请参阅How to initialise a global variable in unit test runs?

      【讨论】:

        【解决方案5】:

        没有支持使用 Mocha 执行此操作的方法。建议的方法是使用一个文件(例如 config.json),要求它,然后让其他人更改它。

        话虽如此,如果您在命令行末尾(在要测试的文件之后)传递您的密钥并使用 -- 它应该可以使用 process.argv (如果您不使用 -- 或者它不在之后一个普通的文件名,那么 mocha 会失败)。

        如果你运行 ./node_modules/mocha/bin/mocha --reporter spec test.js --apiKey=someKey ,并且 test.js 包含代码:

        var assert = require("assert")
        describe("testy", function () {
            it("shouldy", function (done) {
                var value;
                for (var index in process.argv) {
                    var str = process.argv[index];
                    if (str.indexOf("--apiKey") == 0) {
                        value = str.substr(9);
                    }
                }
                assert.equal(value,"someKey")
                done();
            })
        })
        

        测试应该通过

        【讨论】:

          【解决方案6】:

          您可以使用“minimist”模块将参数传递给 mocha 测试脚本。 使用npm install minimist安装

          终端:

          mocha test.js --config=VALUE
          

          Mocha 节点脚本:

          var argv = require('minimist')(process.argv.slice(2));
          console.log('config', argv.config);
          

          【讨论】:

            【解决方案7】:

            一个简单的方法,使用包含命令行args的process.argv

            $ mocha  -w test/*.js --KEY=YOUR_VALUE
            

            稍后,您可以在代码中获取YOUR_VALUE

            let LAST_PARAM = process.argv[process.argv.length-1]
            
            let PARAM_NAME  = LAST_PARAM.split("=")[0].replace("--","")
            let PARAM_VALUE = LAST_PARAM.split("=")[1]
            
            console.log("KEY: ", PARAM_VALUE)
            

            查看全部process.argv

            process.argv.forEach((value, index) => {
                    console.log(`process.argv[${index}]: ${value}`);
            })
            

            输出:

            $ mocha  -w test/*.js --KEY=YOUR_VALUE
            
            KEY:  YOUR_VALUE
            process.argv[0]: /usr/local/bin/node
            process.argv[1]: /Users/pabloin/.npm-packages/lib/node_modules/mocha/bin/_mocha
            process.argv[2]: -w
            process.argv[3]: test/tt.js
            process.argv[4]: test/tt2.js
            process.argv[5]: --KEY=YOUR_VALUE
            
            KEY:  YOUR_VALUE
            process.argv[0]: /usr/local/bin/node
            process.argv[1]: /Users/pabloin/.npm-packages/lib/node_modules/mocha/bin/_mocha
            process.argv[2]: -w
            process.argv[3]: test/tt.js
            process.argv[4]: test/tt2.js
            process.argv[5]: --KEY=YOUR_VALUE
            

            【讨论】:

            • 如果你叫它mocha -w test/*.js --KEY=YOUR_VALUE而不是--KEY=YOUR_KEY,对这里的人来说不是更容易理解吗?
            • 不幸的是,这不适用于新引入的 --parallel 模式。它产生新的 nodejs 进程,并且这些 args 不会传递给它们
            • @Xotabu4 你知道在 --parallel 模式下是否有办法传递参数吗?
            • @DonCharlie 你可以使用环境变量
            【解决方案8】:

            我可以发送参数考虑 mochaStream (require('spawn-mocha-parallel').mochaStream)。

            喜欢:

            var mochaStream = require('spawn-mocha-parallel').mochaStream;
            
            var mocha = mochaStream({
                env: function(){
                    return {yourParam: 'value'}
                }
            });
            
            return gulp.src('test/**/*-specs.js', {read: false})
                .pipe(mochaStream)
                .on('error', console.warn.bind(console));
            

            在 ..spec.js 文件中

            var yourParam = process.env.yourParam;
            

            【讨论】:

              【解决方案9】:

              我已经阅读了很多答案,其中大多数比实际解决方案要复杂。

              假设我有config.ymlconfig.json。在我的例子中,它是一个 YAML 文件。

              首先我安装了yamljs 依赖项。它有一个名为load的函数。

              基本上我是做什么的:

              const YAML = require('yamljs'); const ymlConfig = YAML.load('./config.yml');

              然后我去:

              process.env.setting1 = ymlConfig.setting1; process.env.setting2 = ymlConfig.setting2;

              当然 - 这一切都在您的测试文件中完成。

              【讨论】:

                【解决方案10】:

                如果你正在使用 Mocha 侧边栏(VS Code 扩展)进行调试/测试,只需输入:

                {
                    "mocha.env": {
                        "KEY": "YOUR_KEY",
                        "MY_VARIABLE": "MY VALUE"
                    }
                }
                

                .vscode/settings.json

                【讨论】:

                • 此解决方案过于依赖特定工具。
                • 是的,我想当我把条件放在答案的开头时我很清楚,我只是给出关于主要参考的补充/其他选项。 :)
                猜你喜欢
                • 1970-01-01
                • 2021-07-24
                • 1970-01-01
                • 2018-10-18
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多