추가 옵션 또는 매개 변수가있는 모카 테스트


83

Mocha를 사용하여 Node.js 애플리케이션에 대한 테스트 케이스를 작성하고 있습니다. 테스트 케이스에는 추가 입력 옵션 또는 매개 변수로 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 apr

30

flatiron의 Substack과 nconfoptimist 모듈을 살펴보십시오 . 많은 테스트가 외부 매개 변수에 의존하며 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 test. 단일 테스트를 실행하려면make one NAME=test/unit/sample-test.js

샘플 메이크 파일

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

@roman : 당신이 노력 가지고 npm ---somevar=myval --anothervar = anotherVal run mytest함께 process.env.npm_config_somevar하고 process.env.npm_config_anothervar?
Brett Zamir 19

26

다른 답변은 테스트 스위트를 실행하기 전에 코드 실행을 지원하지 않는다는 점에서 제한됩니다. 매개 변수 전달 만 지원합니다.

이 답변은 테스트 스위트가 실행되기 전에 코드 실행을 지원하며 mocha에 의해 완전히 문서화됩니다.

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 start 및 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

'minimist'모듈을 사용하여 mocha 테스트 스크립트에 인수를 전달할 수 있습니다. 설치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;

물론이 모든 작업은 테스트 파일에서 수행됩니다.


-1

Mocha 사이드 바 (VS 코드 확장)로 디버깅 / 테스트하는 경우 다음을 입력하십시오.

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

...에서 .vscode/settings.json


이 솔루션은 특정 도구와 너무 관련이 있습니다.
MattiSG

네, 대답의 시작 부분에 조건부를 넣었을 때 나는 분명합니다. 주 참조에 대한 보완 / 기타 옵션을 제공하고 있습니다. :)
fsilva
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.