2016-04-28 6 views
2

私は(Cleaning up sinon stubs easilyあたり)は、このような構造でテストしようとしているいくつかのコードを持っている:テストが非同期で実行されているときにsinonサンドボックスを使用するにはどうすればよいですか?

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

同様のTEST2()関数は、次にあります。

しかし、私がしなければ:

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

私が取得:

TypeError: Attempted to wrap method which is already wrapped 

私は、実行順序を把握するために、いくつかのログをやったし、問題は、それが実行されることであることが表示されますtest1 beforeEach()フック、次にtest2 beforeEach()フック、次にtest1 it()などです。最初のテストからafterEach()に到着する前に2番目のbeforeEach()を呼び出すため、問題があります。

これを構造化するより良い方法はありますか?

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() { 
    ... 
    }); 
}); 

をそれとも、これを行うことができます:

答えて

1

テスト仕様の構造は次のようになります

function test1() { 
    ... 
} 

function test2() { 
    ... 
} 

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

しかし、私は関数でこれら二つの仕様を置くことができるようにしたいのですが私はそれらをさまざまなテストのために再利用することができます。そして私はそれらを自己完結型にしたいので、呼び出すたびにサンドボックスとスタブコードを作成する必要はありません。それは不可能ですか? –

+0

私はあなたが何を意味するかを見ます。私の答えを更新してみましょう。 –

+0

余分な記述ラッパー - それを持っているか、各テスト関数の中にあるかのどちらか - それを行います。レポートの余分な層が表示されますが、それは可能です。ありがとう。 –

関連する問題