2012-01-11 4 views
58

テストを実行したときに上記のエラーメッセージが表示されました。以下は私のコードです(私はBackbone JSとJasmineを使ってテストしています)。誰がなぜこれが起こるのか知っていますか?Sinon JS "既にラップされているAjaxをラップしようとしました"

$(function() { 
    describe("Category", function() { 
    beforeEach(function() { 
     category = new Category; 
     sinon.spy(jQuery, "ajax"); 
    } 

    it("should fetch notes", function() { 
     category.set({code: 123}); 
     category.fetchNotes(); 
     expect(category.trigger).toHaveBeenCalled(); 
    } 
    }) 
} 

答えて

88

テストごとにスパイを削除する必要があります。 sinonドキュメントからの例を見てみましょう:

{ 
    setUp: function() { 
     sinon.spy(jQuery, "ajax"); 
    }, 

    tearDown: function() { 
     jQuery.ajax.restore(); // Unwraps the spy 
    }, 

    "test should inspect jQuery.getJSON's usage of jQuery.ajax": function() { 
     jQuery.getJSON("/some/resource"); 

     assert(jQuery.ajax.calledOnce); 
     assertEquals("/some/resource", jQuery.ajax.getCall(0).args[0].url); 
     assertEquals("json", jQuery.ajax.getCall(0).args[0].dataType); 
    } 
} 

だからあなたのジャスミンのテストは次のようになりますで:

$(function() { 
    describe("Category", function() { 
    beforeEach(function() { 
     category = new Category; 
     sinon.spy(jQuery, "ajax"); 
    } 

    afterEach(function() { 
     jQuery.ajax.restore(); 
    }); 

    it("should fetch notes", function() { 
     category.set({code: 123}); 
     category.fetchNotes(); 
     expect(category.trigger).toHaveBeenCalled(); 
    } 
    }) 
} 
+0

私の試行では、afterEachブロックもありましたが、問題は解決しませんでした。私はafterEeachを直前の代わりにすべてのテストの後に置くので、それは可能でしょうか? –

+0

私はそう思う、 'beforeEach'と' afterEach'はあなたのテストと同じように関数呼び出しです。したがって、すべてのテストの後に 'afterEach'を呼び出すことは効果がありません。 –

+0

process.exit.restore(); ... nice – danday74

6

あなたは非常に最初に必要なものは次のとおりです。

before -> 
    sandbox = sinon.sandbox.create() 

    afterEach -> 
    sandbox.restore() 

次に、次のように呼び出します。

windowSpy = sandbox.spy windowService, 'scroll' 
  • 私はコーヒースクリプトを使用していることに注意してください。
+5

開かれていない、または指定されていない限り、答えは質問の言語でなければなりません。 –

+0

@JustinJohnson JSとコーヒースクリプトの間に何か誤解はないと思います。ところで、彼らは同じ言語です。 – Winters

+4

あなたの経験と質問者の経験は同じではありません。 CoffeeScriptは、JavaScriptに文法的な砂糖を加えています(あなたがここで使った)ので、同じことではありません。 –

関連する問題