Тесты 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