假设你有一个简单的摩卡测试:
describe("Suite", function(){
it("test",function(doneCallback){
// here be tests
});
});
在此测试中,我可以通过在this.timeout(VALUE);
函数中的任何位置添加describe
来更改超时。
但是,除了timeout
值之外,还有很多其他Mocha options可以从命令行或生成在测试文件夹中的mocha.opts
文件中独占声明( ./test/mocha.opts
)。
我想要的是在运行时更改其中一些选项(例如,reporter
)而不是命令行/ mocha.opts
文件。
根据我对可能性的研究,我发现有an article explaining how you can use mocha programmatically,它允许在运行时更改这些选项,但是你需要自己创建Mocha
实例,而在普通的情况下test one无法直接访问Mocha
实例。
那么,有没有办法从现有测试中获取Mocha
实例,并在测试期间在运行时更改reporter
这些选项中的一些?
我想有一个选项,不需要以任何方式修改Mocha
的源代码(我想我可以篡改Mocha
实例来实现获取实例直接在Mocha
构造函数中)。
答案 0 :(得分:4)
你可以实现这一目标的最好方法是使用Mocha按照你已经引用的wiki链接,这是以编程方式使用Mocha。
因此,对于您在此处更改reporter
参数的查询是一个简单的示例,可以执行您想要的操作,以便针对包含您的测试的理论上已存在的名为test-file-a.js
的文件运行测试:
var Mocha = require('mocha'),
mocha = new Mocha(),
path = require('path');
mocha.addFile(path.join(__dirname, 'test-file-a.js'));
mocha
.reporter('list')
.run();
除此之外,您还可以使用许多其他选项,并且还有一些用于事件的侦听器,例如test
,您可能希望在测试期间执行某些操作,例如:
mocha
.reporter('list')
.ui('tdd')
.bail()
.timeout(10000)
.run()
.on('test', function(test) {
if (test.title === 'some title that you want here') {
//do something
}
});
请注意,您可以定义每个Mocha实例的选项,这些选项将再次运行测试套件,但不在测试套件的运行时,例如,如果您开始测试{ {1}}选项test-file-a.js
如上所述,当测试运行到其他地方时,您无法更改它,例如您可以使用reporter('list')
选项执行此操作timeout
因此,您必须每次都使用不同的选项实例化一个新的this.timeout()
实例作为上述示例。
答案 1 :(得分:2)
不,你不能。 而不更改代码。
简而言之,mocha是在无法从测试中访问的范围中创建的。如果不详细说明,示波器中提供的对象无法更改所需的选项。 (你不能这样做:link)
但是 有一种方法可以定义自己的记者并自定义每项测试的输出:
创建一个名为 MyCustomReporter.js 的文件:
'use strict';
module.exports = MyCustomReporter;
function MyCustomReporter (runner) {
runner.on('start', function () {
var reporter = this.suite.suites["0"].reporter;
process.stdout.write('\n');
});
runner.on('pending', function () {
process.stdout.write('\n ');
});
runner.on('pass', function (test) {
var reporter = this.suite.useReporter;
if(reporter == 'do this') {
}
else if(reporter == 'do that'){
}
process.stdout.write('\n ');
process.stdout.write('passed');
});
runner.on('fail', function () {
var reporter = this.suite.useReporter;
process.stdout.write('\n ');
process.stdout.write('failed ');
});
runner.on('end', function () {
console.log();
});
}
运行mocha时,将MyCustomReporter.js的路径作为报告参数(不带.js)传递,例如:
mocha --reporter "/home/user/path/to/MyCustomReporter"
默认 mocha脚本实际上会尝试在默认情况下找不到记者文件(在lib / reporter下),github link
最后,在测试中,您可以传递一些参数来自定义报告者的输出:
var assert = require('assert');
describe('Array', function() {
describe('#indexOf()', function() {
this.parent.reporter = 'do this';
it('should return -1 when the value is not present', function() {
this.runnable().parent.useReporter = 'do this';
assert.equal([1,2,3].indexOf(4), -1);
});
});
});