Мока-тести з додатковими опціями або параметрами


83

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

http://mochajs.org/#usage

Але чи можна включити деякі параметри, щоб тестери могли вказати власний ключ API для тесту в командному рядку? Як от:

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

Відповіді:


85

Я не думаю, що сама 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

Погляньте на модуль оптимізму від 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
  }
}

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

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

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?
Бретт Замір,

26

Інші відповіді обмежені тим, що вони не підтримують виконання коду до запуску набору тестів. Вони підтримують лише передавання параметрів.

Ця відповідь підтримує виконання коду ДО того, як ваш набір тестів буде запущений і повністю задокументований mocha

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

create ./test/mocha.opts

--recursive
--reporter spec
--require ./server.bootstrap
--require ./test/test.bootstrap

create ./server.bootstrap.js

global.appRoot = require('app-root-path');
// any more server init code

create ./test/test.bootstrap.js

process.env.NODE_ENV='test';
// any more test specific init code

нарешті, у вашому server.js:

require('./server.bootstrap');

ГОТОВО!

Код у завантажувальному сервері сервера буде виконаний перед тестуванням та виконанням сервера (запуск 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();
    })
})

тест повинен пройти


16

Ви можете передати аргумент тесту мокко сценарію за допомогою модуля мінімізму. Встановити за допомогоюnpm install minimist

Термінал:

mocha test.js --config=VALUE

Сценарій вузла Мокко:

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-паралельно'). 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;

І звичайно - це все зроблено у вашому тестовому файлі.


-1

якщо ви налагоджуєте / тестуєте за допомогою бічної панелі 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.