2016-05-28 2 views
0

Есть ли способ получить массив сообщений, переданных describe?Получить список вызовов mocha `describe` для заданного теста

Я хотел бы динамически создать массив testList из значений, переданных в виде сообщений, в приведенных ниже вызовах describe.

Пример испытания

<script src="https://cdnjs.cloudflare.com/ajax/libs/chai/3.5.0/chai.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/mocha/2.5.3/mocha.min.js"></script> 
 
<link href="https://cdnjs.cloudflare.com/ajax/libs/mocha/2.5.3/mocha.min.css" rel="stylesheet"/> 
 
<div id="mocha"></div> 
 
<script> 
 
    mocha.setup('bdd'); 
 
</script> 
 
<script> 
 
    mocha.checkLeaks(); 
 
    //mocha.globals(['jQuery']); 
 
</script> 
 
<script> 
 
    var expect = chai.expect; 
 
    var testList = ['methodTrue', 'methodFalse', 'methodIdentity']; 
 
    var testObject = { 
 
     methodTrue: function() {return true;}, 
 
     methodFalse: function() {return false;}, 
 
     methodIdentity: function (n) {return n;} 
 
    } 
 
    describe('testObject', function() { 
 
     describe('methodTrue', function() { 
 
      it('should be a method', function() { 
 
       expect(testObject.methodTrue).to.be.a('function'); 
 
      }); 
 
     }); 
 
     describe('methodFalse', function() { 
 
      it('should be a method', function() { 
 
       expect(testObject.methodFalse).to.be.a('function'); 
 
      }); 
 
     }); 
 
     describe('methodIdentity', function() { 
 
      it('should be a method', function() { 
 
       expect(testObject.methodIdentity).to.be.a('function'); 
 
      }); 
 
     }); 
 
     it('should have a method for every test', function() { 
 
      Object.keys(testObject).forEach(function (v, i) { 
 
       expect(testList.indexOf(v), 'no test for ' + v).to.be.above(-1); 
 
      }); 
 
     }); 
 
    }); 
 
    mocha.run(); 
 
</script>

ответ

1

Вы могли бы посмотреть на источник мокко и выяснить, как пройти тестовый набор. Однако, вот способ сделать это, который не зависит от знания внутренних элементов и не будет ломаться, если внутренние изменения меняются. Стратегия состоит в том, чтобы заменить describe на вашу собственную функцию, которая записывает переданные ей данные, чтобы вы могли использовать ее позже. Я использовал Mocha в командной строке, но нет никакой разницы между выполнением этого в пакете, предназначенным для запуска в Node vs, который предназначен для запуска в браузере.

var blocks = []; 

function wrapperDescribe() { 
    // It is generally unsafe to just leak `arguments` objects. So we 
    // slice it to make a copy before pushing it into `blocks`. 
    var args = Array.prototype.slice.call(arguments); 
    blocks.push(args); 
    describe.apply(this, args); 
} 

(function() { 
    // We do not do this at the top level because it would modify a 
    // global used by all Mocha files. Whether or not you do want this 
    // depends on the needs to you project. 
    var describe = wrapperDescribe; 

    function fn() {} 

    describe("one", function() { 
     it("test 1", fn); 
     it("test 2", fn); 
    }); 

    describe("two", function() { 
     it("test 1", fn); 
     it("test 2", fn); 
    }); 
}()); 

console.log(blocks); 

Выход:

$ ./node_modules/.bin/mocha 
[ [ 'one', [Function] ], [ 'two', [Function] ] ] 


    one 
    ✓ test 1 
    ✓ test 2 

    two 
    ✓ test 1 
    ✓ test 2 


    4 passing (6ms) 

массив выводится перед запуском тестов, что является нормальным для мокко. (Mocha сначала читает все тесты, выполняет все describe обратные вызовы, а затем запускает тесты.)

Чтобы получить эту работу только на подмножестве describe блоков, вы можете просто не переопределить describe а называть wrapperDescribe непосредственно по мере необходимости.

Смежные вопросы