Thử nghiệm Mocha với các tùy chọn hoặc thông số bổ sung


83

Tôi đang viết các trường hợp thử nghiệm cho ứng dụng Node.js của mình bằng Mocha. Các trường hợp thử nghiệm cần một khóa API làm tham số hoặc tùy chọn đầu vào bổ sung. Khóa API là riêng tư, vì vậy tôi không muốn đưa nó trực tiếp vào các tệp thử nghiệm vì mọi người sau đó có thể thấy nó trên GitHub. Tôi biết có một số tùy chọn có sẵn cho Mocha tại:

http://mochajs.org/#usage

Nhưng liệu có thể bao gồm một số tham số để cho phép người kiểm tra chỉ định khóa API của riêng họ để kiểm tra trong dòng lệnh không? Nhu la:

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

Câu trả lời:


85

Tôi không nghĩ bản thân Mocha hỗ trợ truyền các tham số bổ sung cho các bài kiểm tra của bạn, nhưng bạn có thể sử dụng các biến môi trường:

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

Và đọc chúng trong các tệp thử nghiệm của bạn:

var key = process.env.KEY;

11
Đối với nhiều thông sốenv KEY1=YOUR_KEY1 KEY2=YOUR_KEY2 mocha test
Philiiiiiipp

vào năm 2017, bây giờ có thể, hãy xem câu trả lời của tôi bên dưới
danday74

2
@ danday74 vấn đề là không chia sẻ thông tin nhạy cảm. Tôi không biết giải pháp của bạn hoạt động như thế nào xung quanh vấn đề đó, vì điều đó có nghĩa là vẫn không thể đăng ký một số tệp nhất định . Việc sử dụng các biến môi trường được truyền trên dòng lệnh sẽ giúp bạn không phải làm điều đó.
robertklep

30

Hãy nhìn vào những người lạc quan mô-đun bằng Substack và nconf từ Flatiron. Rất nhiều thử nghiệm của tôi phụ thuộc vào các tham số bên ngoài và mô-đun nconf và tối ưu giúp dễ dàng tải các tùy chọn cấu hình từ tệp json

Trong lệnh kiểm tra của bạn, hãy chuyển đường dẫn đến tệp config.json

lệnh kiểm tra

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

Thay thế

Một mẫu khác mà tôi đã sử dụng gần đây là mô-đun cấu hình . Bạn có thể chỉ định một ./config/default.ymltệp để chạy thường xuyên và một ./config/test.ymltệp để kiểm tra.

Khi chạy bộ thử nghiệm của bạn, hãy xuất NODE_ENV = test và mô-đun cấu hình sẽ tải test.yml

Trong mã của bạn, có thể dễ dàng truy cập đối tượng cấu hình

var config = require('config')

// config now contains your actual configuration values as determined by the process.env.NODE_ENV
var apiKey = config.api.key

Một cách dễ dàng để đặt kiểm tra NODE_ENV = là chạy các kiểm tra của bạn với một tệp makefile. Chạy tất cả các thử nghiệm của bạn thông qua make test. Để chạy một thử nghiệm duy nhất, hãy thực thimake one NAME=test/unit/sample-test.js

Makefile mẫu

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

Một trong những cách dễ nhất để truyền các tham số tương tự như phương thức process.argv [index] được đề cập trong chủ đề này là sử dụng các biến cấu hình npm. Điều này cho phép bạn nhìn thấy tên biến rõ ràng hơn một chút:

lệnh kiểm tra:

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"

giải pháp này có vẻ khá tốt vì nó sử dụng cơ sở npm. bạn có thể nhận xét về cách bạn có thể truyền nhiều đối số từ dòng lệnh như thế này không?
La Mã

@roman: Bạn đã thử npm ---somevar=myval --anothervar = anotherVal run mytestvới process.env.npm_config_somevarprocess.env.npm_config_anothervar?
Brett Zamir

26

Các câu trả lời khác bị hạn chế ở chỗ chúng không hỗ trợ thực thi mã trước khi chạy bộ thử nghiệm của bạn. Chúng chỉ hỗ trợ truyền các tham số.

Câu trả lời này hỗ trợ thực thi mã TRƯỚC KHI bộ thử nghiệm của bạn được thực thi và được mocha ghi lại đầy đủ

tài liệu mocha: http://unitjs.com/guide/mocha.html#mocha-opts

tạo ./test/mocha.opts

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

tạo ./server.bootstrap.js

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

tạo ./test/test.bootstrap.js

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

cuối cùng trong server.js của bạn:

require('./server.bootstrap');

LÀM XONG!

Mã trong bootstrap máy chủ sẽ được thực thi trước khi kiểm tra và thực thi máy chủ (npm start và npm test)

Mã trong bootstrap thử nghiệm sẽ chỉ được thực thi trước khi thử nghiệm (thử nghiệm npm)

Cảm ơn @damianfabian về điều này - hãy xem Cách khởi tạo biến toàn cục trong các lần chạy thử nghiệm đơn vị?


20

Không có cách nào được hỗ trợ để làm điều này với Mocha. cách được đề xuất là sử dụng một tệp (ví dụ: config.json), yêu cầu nó và để người khác thay đổi nó.

Điều đó đang được nói, nếu bạn chuyển khóa của mình vào cuối dòng lệnh (sau khi tệp để kiểm tra) và sử dụng - nó sẽ có sẵn bằng cách sử dụng process.argv (nếu bạn không sử dụng - hoặc nó không nằm sau tệp thông thường tên, sau đó mocha sẽ thất bại).

nếu bạn chạy ./node_modules/mocha/bin/mocha --reporter spec test.js --apiKey=someKeyvà test.js chứa mã:

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

bài kiểm tra sẽ vượt qua


16

Bạn có thể chuyển một đối số vào tập lệnh kiểm tra mocha bằng mô-đun 'minimist'. Cài đặt vớinpm install minimist

Thiết bị đầu cuối:

mocha test.js --config=VALUE

Tập lệnh nút Mocha:

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

6

Một cách đơn giản, sử dụng process.argv chứa args dòng lệnh

$ mocha  -w test/*.js --KEY=YOUR_VALUE

Sau đó, bạn có thể nhận được YOUR_VALUEmã của mình:

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)

Để xem tất cả process.argv:

process.argv.forEach((value, index) => {
        console.log(`process.argv[${index}]: ${value}`);
})

Đầu ra:

$ 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
Sẽ không dễ hiểu hơn cho những người ở đây nếu bạn gọi nó mocha -w test/*.js --KEY=YOUR_VALUEthay vì nó --KEY=YOUR_KEY?
ndsvw

3

Tôi có thể gửi suy nghĩ tham số mochaStream (request ('spawn-mocha-song song'). MochaStream).

giống:

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

Bên trong tệp ..spec.js

var yourParam = process.env.yourParam;

2

Tôi đã đọc một số câu trả lời, hầu hết chúng phức tạp hơn so với giải pháp thực tế.

Giả sử tôi có config.ymlhoặc config.json. Trong trường hợp của tôi, đó là một tệp YAML.

Trước hết, tôi cài đặt yamljsphụ thuộc. Nó có một chức năng được gọi là load.

Về cơ bản những gì tôi làm:

const YAML = require('yamljs'); const ymlConfig = YAML.load('./config.yml');

Sau đó, tôi đi cho:

process.env.setting1 = ymlConfig.setting1; process.env.setting2 = ymlConfig.setting2;

Và tất nhiên - tất cả điều này được thực hiện trong tệp thử nghiệm của bạn.


-1

nếu bạn đang gỡ lỗi / thử nghiệm với thanh bên Mocha (phần mở rộng Mã VS), chỉ cần đặt nó:

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

tại .vscode/settings.json


Giải pháp này quá ràng buộc với một công cụ cụ thể.
MattiSG

vâng, tôi đoán tôi đã rõ khi đặt câu trả lời có điều kiện ở đầu, tôi chỉ đưa ra phần bổ sung / các tùy chọn khác về tham chiếu chính. :)
fsilva
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.