2016-05-28 7 views
0

Gibt es eine Möglichkeit, ein Array von Nachrichten an describe übergeben zu erhalten?Holen Sie sich eine Liste von Mokka `Descrize` Calls für einen gegebenen Test

Ich möchte das testList Array dynamisch aus den Werten erstellen, die als Nachrichten in den describe-Aufrufen unten übergeben werden.

Beispiel Test-

<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>

Antwort

1

Sie wahrscheinlich an der Quelle des Mokka aussehen könnten und Figur, wie eine Testsuite zu gehen. Aber hier ist ein Weg, dies zu tun, der nicht davon abhängt, die Interna zu kennen und nicht zu brechen, wenn sich die Interna ändern. Die Strategie besteht darin, describe durch eine eigene Funktion zu ersetzen, die aufzeichnet, was an sie übergeben wird, damit Sie sie später verwenden können. Ich habe Mocha in der Befehlszeile verwendet, aber es gibt keinen Unterschied zwischen der Ausführung in einer Suite, die in Node ausgeführt werden soll, und der Ausführung in einem Browser.

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

Der Ausgang:

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


    one 
    ✓ test 1 
    ✓ test 2 

    two 
    ✓ test 1 
    ✓ test 2 


    4 passing (6ms) 

Das Array ausgegeben wird, bevor die Tests ausgeführt werden, die für Mokka normal ist. (Mokka zuerst alle Tests liest, führt alle describe Rückrufe und läuft dann die Tests.)

Um dies auf eine Untergruppe von describe Blöcke nur zu arbeiten, können Sie einfach nicht describe außer Kraft setzen, sondern wrapperDescribe direkt aufrufen je nach Bedarf.