我如何将自定义数据传递给我的摩卡testing?
我们正在使用酱汁实验室进行跨平台/跨浏览器testing。
你可以在这个要点find我的testing套件(以节省这个问题的空间): https : //gist.github.com/chevex/397a5a18a1a386897b41
问题是,我能弄清楚如何将自定义数据传递给testing套件的唯一方法是通过一个环境variables 。 因此,当我的gulp任务试图并行运行testing套件对多个目标时,它们最终都会针对同一个目标运行,因为循环完成迭代,并且process.env.SAUCE_TARGET
被设置为第一个套房甚至运行。
var gulp = require('gulp'); var gulpMocha = require('gulp-mocha'); var mergeStream = require('merge-stream'); gulp.task('sauce-tests', function () { var targets = ['chrome', 'firefox', 'internet explorer']; var streams = targets.map(function (target) { process.env.SAUCE_TARGET = target; return gulp.src('./test/sauce-tests.js', {read:false}) .pipe(gulpMocha({ reporter: 'spec' }); }); return mergeStream.apply(null, streams); });
forEach
提供的闭包没有帮助,因为它在每次迭代中设置一个基本上全局的值( process.env.SAUCE_TARGET
)。
有没有更好的方法将SAUCE_TARGET
传递到我的testing套件中,以便我可以使用不同的目标值并行运行多个testing套件?
如果我同步运行所有的testing,我可以得到它的工作,但这需要比我想要的时间长得多。 阻止并行的唯一的事实是,我不能将封装值传递给我的摩卡套件。
您可以使用child_process
模块在多个浏览器中并行运行testing。
var exec = require('child_process').exec; function runMochaTests(browser) { return new Promise(function(resolve, reject) { var env = {SAUCE_TARGET: browser}; exec('./node_modules/.bin/mocha --reporter spec', {env: env}, function(err) { if(err !== null) { return reject(err); } return resolve(); }); }); }
它用testing创buildsubprocess。 当前的浏览器将作为process.env.SAUCE_TARGET
。
然后你可以在gulp任务中使用这个函数在不同的浏览器中运行testing。
gulp.task('tests', function() { return Promise.all(['chrome', 'firefox', 'internet explorer'].map(function(browser) { return runMochaTests(browsers); })); });
这里使用了Promise,因为gulp
可以接受它们作为任务结果,并且将等待testing在所有浏览器中完成。
你也可以在这里添加一些类似denodeify的语法糖,以使exec
的工作更短一些。
您可以尝试在pipe道之间进行设置,特别是使用刷新function:
var through = require('through2'); var setTarget = function (target) { return through.obj( function (chunk, enc, cb) { cb(null, chunk) }, function (cb) { // flush function process.env.SAUCE_TARGET = target; cb(); } ); } var streams = targets.map(function (target) { return gulp.src('./test/sauce-tests.js', {read:false}) .pipe(setTarget(target)) .pipe(gulpMocha({ reporter: 'spec', globals: [target] }); });