我正在使用 Mocha 为我的 Node.js 应用程序编写测试用例。测试用例需要一个 API 密钥作为额外的输入选项或参数。API 密钥是私有的,所以我不想将它直接包含在测试文件中,因为每个人都可以在 GitHub 上看到它。我知道 Mocha 有一些可用的选项:
但是是否可以包含一些参数让测试人员在命令行中为测试指定自己的 API 密钥?如:
./node_modules/mocha/bin/mocha test/*.js --key YOUR_KEY
我正在使用 Mocha 为我的 Node.js 应用程序编写测试用例。测试用例需要一个 API 密钥作为额外的输入选项或参数。API 密钥是私有的,所以我不想将它直接包含在测试文件中,因为每个人都可以在 GitHub 上看到它。我知道 Mocha 有一些可用的选项:
但是是否可以包含一些参数让测试人员在命令行中为测试指定自己的 API 密钥?如:
./node_modules/mocha/bin/mocha test/*.js --key YOUR_KEY
我认为 Mocha 本身不支持将额外参数传递给您的测试,但您可以使用环境变量:
env KEY=YOUR_KEY mocha test/*.js # assumes some sort of Unix-type OS.
并在您的测试文件中阅读它们:
var key = process.env.KEY;
传递类似于此线程中提到的 process.argv[index] 方法的参数的最简单方法之一是使用 npm 配置变量。这使您可以更清楚地看到变量名称:
测试命令:
npm --somevariable=myvalue run mytest
包.json:
"scripts": {
"mytest": "mocha ./test.js" }
测试.js
console.log(process.env.npm_config_somevariable) // should evaluate to "myvalue"
看看 Substack 的optimist模块和flatiron的 nconf 。我的很多测试都依赖于外部参数,而 optimist 和 nconf 模块可以轻松地从 json 文件加载配置选项
在您的测试命令中,将路径传递给 config.json 文件
mocha test/api-test.js --config=/path/to/config.json --reporter spec
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
{
"api": {
"key": "fooKey",
"host": "example.com",
"port": 9000
}
}
我最近使用的另一种模式是配置模块。您可以指定一个./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
其他答案的局限性在于它们不支持在运行测试套件之前执行代码。它们只支持传递参数。
此答案支持在您的测试套件执行之前执行代码,并由 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 提供的这个 - 请参阅如何在单元测试运行中初始化全局变量?
没有受支持的方式来使用 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();
})
})
测试应该通过
您可以使用“minimist”模块将参数传递给 mocha 测试脚本。安装npm install minimist
终端:
mocha test.js --config=VALUE
摩卡节点脚本:
var argv = require('minimist')(process.argv.slice(2));
console.log('config', argv.config);
一种简单的方法,使用包含命令行参数的 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
我可以发送参数认为 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;
我一直在阅读很多答案,其中大多数比实际解决方案要复杂。
假设我有config.yml
or config.json
。就我而言,它是一个 YAML 文件。
首先,我安装yamljs
依赖项。它有一个名为load
.
基本上我做什么:
const YAML = require('yamljs');
const ymlConfig = YAML.load('./config.yml');
然后我去:
process.env.setting1 = ymlConfig.setting1;
process.env.setting2 = ymlConfig.setting2;
当然 - 这一切都在您的测试文件中完成。
如果您正在使用 Mocha 侧边栏(VS Code 扩展)进行调试/测试,只需输入:
{
"mocha.env": {
"KEY": "YOUR_KEY",
"MY_VARIABLE": "MY VALUE"
}
}
在.vscode/settings.json