2014-09-29 11 views
11

Mit NodeJS und Mokka zum Testen. Ich denke, ich verstehe, wie vorher() und vor jeder() Arbeit. Das Problem ist, ich möchte ein Setup-Skript hinzufügen, das vor jedem "Beschreiben" statt vor jedem "Es" ausgeführt wird.Lauf Mokka-Setup vor jeder Suite anstatt vor jedem Test

Wenn ich before() verwende, wird es nur einmal für die gesamte Suite ausgeführt, und wenn ich beforeEach() verwende, wird es vor jedem einzelnen Test ausgeführt, also versuche ich, einen Mittelweg zu finden. So

wenn diese Datei mein Test ist:

require('./setupStuff'); 

describe('Suite one', function(){ 
    it('S1 Test one', function(done){ 
    ... 
    }); 
    it('S1 Test two', function(done){ 
    ... 
    }); 
}); 
describe('Suite two', function(){ 
    it('S2 Test one', function(done){ 
    ... 
    }); 
}); 

Ich möchte "setupStuff" eine Funktion enthalten, die vor läuft 'Suite ein' und 'Suite zwei'

Oder mit anderen Worten, vor 'S1 Test eins' und 'S2 Test eins', aber NICHT vor 'S1 Test zwei'.

Kann es getan werden?

Antwort

15

Es gibt keinen Anruf ähnlich wie beforeEach oder before, der das tut, was Sie wollen. Aber ist es nicht erforderlich, weil man es auf diese Weise tun können:

function makeSuite(name, tests) { 
    describe(name, function() { 
     before(function() { 
      console.log("shared before"); 
     }); 
     tests(); 
     after(function() { 
      console.log("shared after"); 
     }); 
    }); 
} 

makeSuite('Suite one', function(){ 
    it('S1 Test one', function(done){ 
     done(); 
    }); 
    it('S1 Test two', function(done){ 
     done(); 
    }); 
}); 

makeSuite('Suite two', function(){ 
    it('S2 Test one', function(done){ 
    done(); 
    }); 
}); 
+0

Das funktioniert! Danke – FuzzyYellowBall

4

Sie können es in diesem flexibler:

require('./setupStuff'); 

describe('Suite one', function(){ 
    loadBeforeAndAfter(); //<-- added 
    it('S1 Test one', function(done){ 
    ... 
    }); 
    it('S1 Test two', function(done){ 
    ... 
    }); 
}); 
describe('Suite two', function(){ 
    loadBeforeAndAfter();//<-- added 
    it('S2 Test one', function(done){ 
    ... 
    }); 
}); 
describe('Suite three', function(){ 
    //use some other loader here, before/after, or nothing 
    it('S3 Test one', function(done){ 
    ... 
    }); 
}); 

function loadBeforeAndAfter() { 
    before(function() { 
    console.log("shared before"); 
    }); 
    after(function() { 
    console.log("shared after"); 
    }); 
} 
+1

Schön modular! – colsen

0

ich diesen Ansatz gefunden haben für mich gearbeitet, es ist alles Patches beschreiben Suiten.

function suitePatches() 
{ 
    before(function() 
    { 
     // before suite behaviour 
    }); 
    after(function() 
    { 
     // after suite behaviour 
    }); 
} 

let origDescribe = describe; 
describe = function(n,tests) 
{ 
    origDescribe(n,function() 
    { 
     suitePatches(); 
     tests.bind(this)(); 
    }); 
} 
let origOnly = origDescribe.only; 
describe.only = function(n,tests) 
{ 
    origOnly(n,function() 
    { 
     suitePatches(); 
     tests.bind(this)(); 
    }); 
} 
describe.skip = origDescribe.skip; 

Differenzen aus den anderen Antworten sind:

  • Die Verwendung von bind die tests zu nennen, die dafür sorgt, dass, wenn sie Funktionen auf this nennen, wie this.timeout(1000) wird immer noch funktionieren.
  • Handhabung .skip und .only bedeutet, dass Sie immer noch diejenigen auf Ihrer Suite verwenden können, z. B. describe.skip, um Suiten vorübergehend zu unterdrücken.
  • Das Ersetzen der Funktion describe durch den Namen ermöglicht eine weniger aufdringliche Injektion.
    • kann in diesem Fall für jeden Geschmack, sei offensichtlich eine alternative Funktionsnamen verwendet werden können, während immer noch die Nutzung der richtigen Handhabung Das ist nicht die tests und only und skip aufzurufen.
Verwandte Themen