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

Javascript 有没有办法在运行时获取当前Mocha实例和编辑选项?,javascript,automation,mocha.js,Javascript,Automation,Mocha.js,假设您有一个简单的摩卡测试: describe("Suite", function(){ it("test",function(doneCallback){ // here be tests }); }); 在这个测试中,我可以通过添加this.timeout(值)来更改超时描述功能中的任何位置 但是,除了timeout值之外,还有许多其他值可以从命令行或test文件夹中的mocha.opts文件(/test/mocha.opts)以独占方式声明 我想要的是在运

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

describe("Suite", function(){
    it("test",function(doneCallback){
        // here be tests
    });
});
在这个测试中,我可以通过添加
this.timeout(值)来更改超时描述功能中的任何位置

但是,除了
timeout
值之外,还有许多其他值可以从命令行或test文件夹中的
mocha.opts
文件(
/test/mocha.opts
)以独占方式声明

我想要的是在运行时更改其中一些选项(例如,
reporter
),而不是在命令行/
mocha.opts
文件中

从我对什么是可能的研究中,我发现有,这将允许在运行时更改这些选项,但您需要自己创建
Mocha
实例,而在普通测试中,您无法直接访问
Mocha
实例

那么,有没有一种方法可以从现有测试中获取
Mocha
实例,并在测试期间的运行时更改其中一些选项,如
reporter


我希望有一个选项,它不需要以任何方式修改
Mocha
的源代码(我想我可以篡改
Mocha
实例,实现一种直接在
Mocha
构造函数中获取实例的方法).

实现这一目标的最佳方法是根据您已经引用的wiki链接使用Mocha,即通过编程方式使用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实例定义选项,这些实例将再次运行测试套件,但不是在测试套件的运行时,因此,例如,如果您使用选项
reporter('list')启动
test-file-a.js
的测试
如上所述,当测试正在运行时,您不能将其更改为其他内容,例如您可以使用
timeout
选项来执行
this.timeout()

因此,您必须实例化一个新的
Mocha
实例,就像上面的例子一样,每次都有不同的选项。

不,您不能。不更改代码

简而言之,mocha是在您无法通过测试访问的范围内创建的。如果不详细说明,范围中提供的对象将无法更改所需的选项。(您不能这样做:)

但是有一种方法可以定义您自己的报告程序,并自定义每个测试的输出:

创建一个名为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脚本实际上试图要求一个报告程序文件,如果在默认文件中找不到它(在lib/reporters下)

最后,在测试中,您可以传递一些参数以自定义reporter的输出:

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

看起来你想跟随那篇文章,在那篇文章中你自己创建了一个摩卡实例。@kevzettler什么文章?我链接到的那个?这需要您自己创建
Mocha
实例和
Mocha
运行程序(添加测试文件等),而我希望从命令行
Mocha myTest.js
使用
myTest.js
钩住
Mocha
实例,并能够在运行时修改选项是,这篇文章。@kevzettler你能在一个答案中详细说明如何做吗?我接受这个答案是因为事实上,你不能从另一个上下文中得到这个实例,而且这是我更好地理解它的一个很好的资源。然而,在我看来,你解释如何创建一个定制记者的部分是漫无边际的。我已经有了一个报告器,我想在运行时从默认报告器(
list
)切换到自定义报告器。
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);
    });
  });
});