摩卡testing与额外的选项或参数

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

http://mochajs.org/#usage

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

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

我不认为摩卡本身支持传递额外的参数给你的testing,但你可以使用环境variables:

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

并在你的testing文件中读取它们:

 var key = process.env.KEY; 

看看Substack的optimist模块和flatiron的nconf 。 我的很多testing依赖于外部参数,而optimist和nconf模块可以很容易地从json文件加载configuration选项

在你的testing命令中传递config.json文件的path

testing命令

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

替代

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

运行testing套件时,导出NODE_ENV = test,configuration模块将加载test.yml

在你的代码中很容易访问configuration对象

 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运行testing。 通过make test运行所有的testing。 要运行单个testing,请执行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 

有没有支持的方式与摩卡做到这一点。 build议的方法是使用一个文件(例如config.json),需要它,让其他人改变它。

也就是说,如果你在命令行结束时(在testing文件之后)传递你的密钥并使用它,它应该可以使用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(); }) }) 

testing应该通过

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

testing命令:

 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" 

您可以使用'minimist'模块将parameter passing给mochatesting脚本。 用npm install minimist

终奌站:

 mocha test.js --config=VALUE 

摩卡节点脚本:

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

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

这个答案在你的testing套件执行之前支持代码执行,并由摩卡充分logging

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

创build./test/mocha.opts

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

创build./test/server.bootstrap.js

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

创build./test/test.bootstrap.js

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

终于在你的server.js中:

 require('./test/server.bootstrap'); 

DONE!

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

testing引导程序中的代码只会在testing之前执行(npmtesting)

感谢@ damianfabian这个 – 请参阅如何在unit testing运行中初始化一个全局variables?

我可以发送参数思考mochaStream(需要('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; 

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

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

稍后,您可以在您的代码中获得YOUR_KEY:

 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_KEY KEY: YOUR_KEY 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_KEY KEY: YOUR_KEY 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_KEY 

我一直在阅读相当多的答案,其中大部分比实际的解决scheme更复杂。

比方说,我有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;

当然 – 这一切都在你的testing文件中完成。