Тесты Mocha с дополнительными параметрами или параметрами
Я пишу тестовые примеры для своего приложения Node.js, используя Mocha. Для тестовых случаев необходим ключ API в качестве дополнительной опции или параметра ввода. Ключ API является закрытым, поэтому я не хочу включать его непосредственно в тестовые файлы, так как каждый может видеть его на GitHub. Я знаю, что для Mocha есть некоторые варианты:
http://mochajs.org/#usage
Но можно ли включить некоторые параметры, чтобы тестеры могли указать свой собственный ключ API для теста в командной строке? Например:
./node_modules/mocha/bin/mocha test/*.js --key YOUR_KEY
Ответы
Ответ 1
Я не думаю, что Mocha сам поддерживает передачу дополнительных параметров вашим тестам, но вы можете использовать переменные среды:
env KEY=YOUR_KEY mocha test/*.js # assumes some sort of Unix-type OS.
И прочитайте их в тестовых файлах:
var key = process.env.KEY;
Ответ 2
Взгляните на модуль optimist от Substack и nconf от flatiron. Многие мои тесты зависят от внешних параметров, а модули 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
}
}
Alternative
Еще один образец, который я использовал недавно, - это 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 является запуск тестов с помощью make файла. Запустите все ваши тесты с помощью 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
Ответ 3
Там нет поддерживаемого способа сделать это с помощью 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();
})
})
тест должен пройти
Ответ 4
Один из самых простых способов передать параметры, похожие на метод process.argv [index], упомянутый в этом потоке, - это использовать переменные конфигурации npm. Это позволяет вам увидеть название переменной немного более четко:
команда test:
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"
Ответ 5
Другие ответы ограничены тем, что они не поддерживают выполнение кода до запуска вашего набора тестов. Они поддерживают только передаваемые параметры.
Этот ответ поддерживает выполнение кода ДО того, как ваш набор тестов будет выполнен и полностью задокументирован 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 и тест npm)
Код в тестовой начальной загрузке будет выполнен только до тестирования (тест npm)
Спасибо @damianfabian за это - см. Как инициализировать глобальную переменную в модульных тестах?
Ответ 6
Вы можете передать аргумент mocha test script с помощью модуля minimist.
Установите с помощью npm install minimist
Терминал:
mocha test.js --config=VALUE
Mocha node script:
var argv = require('minimist')(process.argv.slice(2));
console.log('config', argv.config);
Ответ 7
Я мог бы отправить параметр 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;
Ответ 8
Простой способ, используя 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
Ответ 9
Я читал довольно некоторые ответы, большинство из них более сложные, чем фактическое решение должно быть.
Скажем, у меня есть config.yml
или 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;
И, конечно же, все это делается в тестовом файле.
Ответ 10
если вы отлаживаете/тестируете с боковой панелью Mocha (расширение кода VS), просто поместите это:
{
"mocha.env": {
"KEY": "YOUR_KEY",
"MY_VARIABLE": "MY VALUE"
}
}
в .vscode/settings.json