有没有办法在运行时获取当前的Mocha实例和编辑选项?

时间:2017-12-11 15:03:39

标签: javascript automation mocha

假设你有一个简单的摩卡测试:

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构造函数中)。

2 个答案:

答案 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);
    });
  });
});