Есть ли способ получить текущий экземпляр Mocha и изменить параметры во время выполнения?

Скажем, у вас есть простой тест мокко:

describe("Suite", function(){
    it("test",function(doneCallback){
        // here be tests
    });
});

В этом тесте я могу изменить таймаут, добавив this.timeout(VALUE); в любом месте функции describe.

Однако, помимо значения timeout, существует множество других параметров Mocha, которые могут быть объявлены исключительно из командной строки или из a mocha.opts, который находится в тестовой папке (./test/mocha.opts).

Я хочу изменить некоторые из этих параметров во время выполнения (например, reporter), а не в командной строке /mocha.opts.

Из моего исследования того, что возможно, я обнаружил, что существует статья, объясняющая, как вы можете программно использовать mocha, что позволило бы изменить эти параметры во время выполнения, но вам нужно создать экземпляр Mocha самостоятельно, тогда как в обычном тесте нет прямого доступа к экземпляру Mocha.

Итак, есть ли способ получить экземпляр Mocha из существующего теста и изменить некоторые из этих параметров, например reporter во время выполнения во время теста?

Я хотел бы иметь опцию, которая не требует какого-либо изменения исходного кода Mocha (я полагаю, я мог бы вмешаться в экземпляр Mocha, чтобы реализовать способ получить экземпляр непосредственно в Mocha).

Ответ 1

Нет, вы не можете. без изменения кода.

Короче говоря, мокка создается в области, к которой вы не можете получить доступ из тестов. Не вдаваясь в подробности, объекты, предоставленные в вашей области, не могут изменить нужные параметры. (Вы не можете сделать это: ссылка)

Но существует способ определить собственный репортер и настроить вывод для каждого теста:

Создайте файл с именем 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 script на самом деле пытается потребовать файл репортера, если он не найден в стандартном (под lib/reporters), ссылка github

Наконец, в ваших тестах вы можете передать некоторые параметры для настройки вывода вашего репортера:

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

Ответ 2

Лучший способ достичь этого - использовать 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, которые снова будут запускать тестовый пакет, но не во время выполнения тестового набора, так, например, если вы начнете свои тесты для test-file-a.js с опцией reporter('list'), как указано выше, вы не можете ее изменить, пока тесты работают на что-то еще, например, вы можете сделать это с помощью параметра timeout, где вы можете сделать this.timeout().

Итак, вам нужно будет создать экземпляр нового экземпляра Mocha в качестве примеров выше с различными параметрами каждый раз.