带有额外选项或参数的Mocha测试


83

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

http://mochajs.org/#usage

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

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

Answers:


85

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

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

并在测试文件中读取它们:

var key = process.env.KEY;

11
对于多个参数env KEY1=YOUR_KEY1 KEY2=YOUR_KEY2 mocha test
Philiiiiiipp,2016年

在2017年现在有可能,请参阅下面的答案
danday74

2
@ danday74问题不共享敏感信息。我看不到您的解决方案如何解决该问题,因为这意味着某些文件仍然无法检入。使用在命令行中传递的环境变量可以避免这样做。
robertklep

30

看看Substack和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

样本makefile

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

28

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

测试命令:

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吗?
Brett Zamir

26

其他答案是有限的,因为它们在运行测试套件之前不支持代码执行。它们仅支持传递参数。

在您的测试套件执行之前,此答案支持代码执行,并且由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测试)之前执行

感谢@damianfabian的帮助-请参阅如何在单元测试运行中初始化全局变量?


20

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

话虽这么说,如果您在命令行末尾(在要测试的文件之后)传递密钥并使用-应该可以使用process.argv使用它(如果您不使用-或不在常规文件之后)名称,那么摩卡咖啡将失败)。

如果您运行./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();
    })
})

测试应该通过


16

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

终奌站:

mocha test.js --config=VALUE

Mocha节点脚本:

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

6

一种简单的方法,使用包含命令行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

1
如果您叫它mocha -w test/*.js --KEY=YOUR_VALUE代替,对这里的人来说会不会更容易理解--KEY=YOUR_KEY
ndsvw

3

我可以发送参数思想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;

2

我一直在阅读很多答案,其中大多数答案都比实际解决方案复杂。

假设我有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;

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


-1

如果您要使用Mocha侧边栏(VS代码扩展)进行调试/测试,则只需输入以下内容:

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

.vscode/settings.json


该解决方案与特定工具紧密相关。
MattiSG

是的,我想我很清楚将条件答案放在开头时,只是在提供关于主要参考文献的补充/其他选择。:)
fsilva
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.