追加のオプションまたはパラメーターを使用したMochaテスト


83

Mochaを使用してNode.jsアプリケーションのテストケースを作成しています。テストケースには、追加の入力オプションまたはパラメーターとしてAPIキーが必要です。APIキーは秘密であるため、GitHubで誰でも見ることができるため、テストファイルに直接含めたくありません。私はモカのために利用可能ないくつかのオプションがあることを知っています:

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 2016

2017年にそれが可能になりました。以下の私の答えを参照してください
danday74

2
@ danday74問題は機密情報の共有ではありません。特定のファイルをまだチェックインできないことを意味するため、ソリューションがどのように機能するかわかりません。コマンドラインで渡された環境変数を使用すると、それを行う必要がなくなります。
robertklep 2017

30

Flatironの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
  }
}

代替案

私が最近使用しているもう1つのパターンは、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 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]メソッドと同様のパラメーターを渡す最も簡単な方法の1つは、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 mytestprocess.env.npm_config_somevarしてprocess.env.npm_config_anothervar
ブレットザミール

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');

完了!

サーバーブートストラップのコードは、テストとサーバー実行の前に実行されます(npmstartとnpmtest)

テストブートストラップのコードは、テストの前にのみ実行されます(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 Code拡張機能)を使用してデバッグ/テストしている場合は、次のように入力します。

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

.vscode/settings.json


このソリューションは、特定のツールに縛られすぎています。
MattiSG

うん、答えの最初に条件付きを置くとはっきりしていると思う。メインリファレンスについて補足/その他のオプションを与えているだけだ。:)
fsilva
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.