Mocha使用额外的选项或参数进行测试

aft*_*lee 77 mocha.js node.js

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

http://mochajs.org/#usage

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

./node_modules/mocha/bin/mocha test/*.js --key YOUR_KEY
Run Code Online (Sandbox Code Playgroud)

rob*_*lep 77

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

env KEY=YOUR_KEY mocha test/*.js # assumes some sort of Unix-type OS.
Run Code Online (Sandbox Code Playgroud)

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

var key = process.env.KEY;
Run Code Online (Sandbox Code Playgroud)

  • 对于多个参数`env KEY1 = YOUR_KEY1 KEY2 = YOUR_KEY2 mocha test` (10认同)
  • @ danday74问题不在于共享敏感信息.我没有看到您的解决方案如何解决这个问题,因为这意味着无法检入某些文件_still_.使用命令行上传递的环境变量可以防止必须这样做. (2认同)

Noa*_*oah 28

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

在test命令中,传递config.json文件的路径

测试命令

mocha test/api-test.js --config=/path/to/config.json --reporter spec
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

config.json

{
  "api": {
    "key": "fooKey",
    "host": "example.com",
    "port": 9000
  }
}
Run Code Online (Sandbox Code Playgroud)

替代

我最近使用的另一种模式是配置模块.您可以指定./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
Run Code Online (Sandbox Code Playgroud)

设置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
Run Code Online (Sandbox Code Playgroud)


小智 24

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

测试命令:

npm --somevariable=myvalue run mytest
Run Code Online (Sandbox Code Playgroud)

的package.json:

"scripts": {
"mytest": "mocha ./test.js" }
Run Code Online (Sandbox Code Playgroud)

test.js

console.log(process.env.npm_config_somevariable) // should evaluate to "myvalue"
Run Code Online (Sandbox Code Playgroud)


dan*_*y74 21

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

这个答案支持在执行测试套件之前执行代码,并且由mocha完全记录

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

创建./test/mocha.opts

--recursive
--reporter spec
--require ./server.bootstrap
--require ./test/test.bootstrap
Run Code Online (Sandbox Code Playgroud)

创建./server.bootstrap.js

global.appRoot = require('app-root-path');
// any more server init code
Run Code Online (Sandbox Code Playgroud)

创建./test/test.bootstrap.js

process.env.NODE_ENV='test';
// any more test specific init code
Run Code Online (Sandbox Code Playgroud)

终于在你的server.js:

require('./server.bootstrap');
Run Code Online (Sandbox Code Playgroud)

DONE!

服务器引导程序中的代码将在测试和服务器执行之前执行(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();
    })
})
Run Code Online (Sandbox Code Playgroud)

测试应该通过


Dav*_*las 16

您可以使用'minimist'模块将参数传递给mocha测试脚本.安装时npm install minimist

终奌站:

mocha test.js --config=VALUE
Run Code Online (Sandbox Code Playgroud)

摩卡节点脚本:

var argv = require('minimist')(process.argv.slice(2));
console.log('config', argv.config);
Run Code Online (Sandbox Code Playgroud)


Pab*_*iel 6

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

$ mocha  -w test/*.js --KEY=YOUR_VALUE
Run Code Online (Sandbox Code Playgroud)

稍后,您可以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)
Run Code Online (Sandbox Code Playgroud)

查看全部process.argv

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

输出:

$ 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
Run Code Online (Sandbox Code Playgroud)