Тесты мокко с дополнительными опциями или параметрами


85

Я пишу тестовые примеры для своего приложения Node.js, используя Mocha. Для тестовых случаев требуется ключ API в качестве дополнительной опции ввода или параметра. Ключ API является частным, поэтому я не хочу включать его непосредственно в тестовые файлы, так как каждый сможет увидеть его на GitHub. Я знаю, что для Mocha есть несколько вариантов:

http://mochajs.org/#usage

Но можно ли включить некоторые параметры, чтобы позволить тестировщикам указывать свой собственный ключ API для теста в командной строке? Такие как:

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

Ответы:


86

Я не думаю, что сам Mocha поддерживает передачу дополнительных параметров вашим тестам, но вы можете использовать переменные среды:

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

И прочтите их в своих тестовых файлах:

var key = process.env.KEY;

11
Для нескольких параметровenv KEY1=YOUR_KEY1 KEY2=YOUR_KEY2 mocha test
Philiiiiiipp

в 2017 году это возможно, см. мой ответ ниже
danday74

2
@ danday74 проблема не в том, чтобы делиться конфиденциальной информацией. Я не понимаю, как ваше решение работает с этим, потому что это означает, что некоторые файлы все еще не могут быть возвращены. Использование переменных среды, переданных в командной строке, предотвращает необходимость этого.
robertklep

30

Взгляните на модуль optimist от Substack и nconf от . Многие мои тесты зависят от внешних параметров, а модули 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
  }
}

Альтернатива

Еще один шаблон, который я недавно использовал, - это модуль конфигурации . Вы можете указать ./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

Образец make-файла

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

28

Один из самых простых способов передать параметры, аналогичные методу process.argv [index], упомянутому в этом потоке, - это использование переменных конфигурации npm. Это позволит вам более четко увидеть имя переменной:

тестовая команда:

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"

это решение кажется довольно хорошим, поскольку оно использует средство npm. не могли бы вы прокомментировать, как можно передать несколько аргументов из командной строки таким образом?
романский

@roman: Вы пробовали npm ---somevar=myval --anothervar = anotherVal run mytestс process.env.npm_config_somevarи process.env.npm_config_anothervar?
Brett Zamir

26

Другие ответы ограничены тем, что они не поддерживают выполнение кода до запуска вашего набора тестов. Они поддерживают только передачу параметров.

Этот ответ поддерживает выполнение кода ДО того, как будет выполнен ваш набор тестов, и полностью задокументирован 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 за это - см. Как инициализировать глобальную переменную при запуске модульного теста?


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();
    })
})

тест должен пройти


15

Вы можете передать аргумент скрипту теста мокко, используя модуль Minimist. Установить с помощьюnpm install minimist

Терминал:

mocha test.js --config=VALUE

Скрипт узла Mocha:

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

6

Простой способ, используя 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

1
Разве здесь не будет легче понять людям, если вы назовете это mocha -w test/*.js --KEY=YOUR_VALUEвместо --KEY=YOUR_KEY?
ndsvw

3

Я мог бы отправить параметр мысли 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;

2

Я читал довольно много ответов, большинство из них более сложные, чем должно быть фактическое решение.

Допустим, у меня есть 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;

И, конечно же - все это делается в вашем тестовом файле.


0

если вы отлаживаете / тестируете боковую панель Mocha (расширение VS Code), просто укажите это:

{
    "mocha.env": {
        "KEY": "YOUR_KEY",
        "MY_VARIABLE": "MY VALUE"
    }
}

в .vscode/settings.json


Это решение слишком привязано к конкретному инструменту.
MattiSG

да, я думаю, что мне ясно, когда я помещаю условное в начале ответа, я просто даю дополнительные / другие варианты для основной ссылки. :)
fsilva
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.