我如何将自定义数据传递给我的摩卡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] }); });