2012-01-11 13 views
58

Tôi nhận được thông báo lỗi ở trên khi chạy thử nghiệm của mình. Dưới đây là mã của tôi (tôi đang sử dụng Backbone JS và Jasmine để thử nghiệm). Có ai biết tại sao điều này xảy ra không?Sinon JS "Đã cố gắng bọc ajax đã được bọc"

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

Trả lời

88

Bạn phải xóa gián điệp sau mỗi lần kiểm tra. Hãy xem ví dụ từ các tài liệu 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); 
    } 
} 

Vì vậy, trong thử nghiệm hoa nhài của bạn sẽ giống như thế này:

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

Trong một trong các thử nghiệm của mình, tôi cũng có một khối afterEach nhưng nó không giải quyết được vấn đề. Có thể vì tôi đặt afterEeach sau tất cả các bài kiểm tra thay vì ngay sau beforeEach? –

+0

Tôi nghĩ như vậy, gây ra 'beforeEach' và' afterEach' là các cuộc gọi hàm giống như các bài kiểm tra của bạn. Vì vậy, gọi 'afterEach' sau khi tất cả các bài kiểm tra của bạn sẽ không có hiệu lực. –

+0

process.exit.restore(); ... tốt đẹp – danday74

6

Những gì bạn cần trong đầu là:

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

    afterEach -> 
    sandbox.restore() 

Sau đó gọi một cái gì đó như:

windowSpy = sandbox.spy windowService, 'scroll' 
  • Xin lưu ý rằng tôi sử dụng tập lệnh cà phê.
+5

Trừ khi mở kết thúc hoặc không xác định, câu trả lời nên được trong ngôn ngữ câu hỏi được in –

+0

@JustinJohnson Tôi không nghĩ rằng có bất kỳ sự hiểu lầm giữa JS và kịch bản cà phê. BTW, họ là ngôn ngữ CÙNG. – Winters

+4

Kinh nghiệm của bạn và của người hỏi không giống nhau, và bạn không nên cho rằng họ là như vậy. CoffeeScript thêm cú pháp đường vào JavaScript (mà bạn đã sử dụng ở đây), vì vậy chúng * không * cùng một thứ. –