2016-04-28 14 views
2

Ich habe einige Code habe ich mit einer Struktur wie folgt zu testen, ich versuche (pro Cleaning up sinon stubs easily):Wie verwende ich Sinon-Sandboxen, wenn Tests asynchron ausgeführt werden?

function test1() { 
    // manually create and restore the sandbox 
    var sandbox; 
    beforeEach(function() { 
     sandbox = sinon.sandbox.create(); 
     sandbox.stub(globalVar, "method", function() { return 1; }); 
    }); 

    afterEach(function() { 
     sandbox.restore(); 
    }); 

    it('tests something', function(done) { 
     anAsyncMethod(function() { doSomething(); done(); }); 
    } 
} 

Es gibt dann eine ähnliche test2() Funktion.

Aber wenn ich tun:

describe('two tests', function() { 
    test1(); 
    test2(); 
} 

ich:

TypeError: Attempted to wrap method which is already wrapped 

Ich habe einige Protokollierung getan, um den Lauf, um herauszufinden, und es scheint, dass das das Problem ist, dass es die läuft test1 beforeEach() haken, dann die test2 beforeEach() haken, dann die test1 it(), etc. Weil es die zweite beforeEach() ruft, bevor es auf die afterEach() aus dem ersten test, wir haben ein problem.

Gibt es einen besseren Weg, ich sollte dies strukturieren?

Antwort

1

Die Struktur Ihres Test spec sollte wie folgt aussehen:

describe("A spec (with setup and tear-down)", function() { 
    var sandbox; 

    beforeEach(function() { 
    sandbox = sinon.sandbox.create(); 
    sandbox.stub(globalVar, "method", function() { return 1; }); 
    }); 

    afterEach(function() { 
    sandbox.restore(); 
    }); 

    it("should test1", function() { 
    ... 
    }); 

    it("should test2", function() { 
    ... 
    }); 
}); 

Oder Sie könnten dies tun:

function test1() { 
    ... 
} 

function test2() { 
    ... 
} 

describe("A spec (with setup and tear-down)", function() { 
    describe("test1", test1); 
    describe("test2", test2); 
}); 
+0

Aber ich mag diese beiden Angaben in Funktionen setzen können, so kann ich sie für eine Vielzahl von Tests wiederverwenden. Und ich möchte, dass sie eigenständig sind, so dass ich nicht jedes Mal den Sandbox- und Stubs-Code erstellen muss, wenn ich sie anrufe. Ist das nicht möglich? –

+0

Ich sehe was du meinst. Lassen Sie mich meine Antwort aktualisieren - immer noch neu beim Formatieren von Code in Kommentaren. –

+0

Der extra beschreibende Wrapper - entweder wie Sie es haben oder nur innerhalb jeder Testfunktion - tut es. Zusätzliche Berichtsebene, aber so gut wie es scheint, ist möglich. Vielen Dank. –

Verwandte Themen