2012-11-20 31 views
13

Tôi có một bộ thử nghiệm đơn giản có một hàm it bên trong nó. Tôi muốn nhìn thấy nếu một chức năng nhất định được gọi là trong phạm vi chức năng tôi đang gọi điện thoại, vì vậy tôi có một cái gì đó như thế này:Tại sao tôi phải gọi spyOn trong beforeEach()?

describe("doStuff", function() { 
    var foo = new Foo(); 
    spyOn(foo, "doOtherStuff"); 
    foo.doStuff(true); 
    it("should do stuff and other stuff", function() { 
     expect(foo.stuffDone).toBe(true); 
     expect(foo.doOtherStuff).toHaveBeenCalled(); 
    }); 
}); 

Tuy nhiên, điều này mang lại cho tôi những lỗi: Expected a spy, but got Function.

Sau khi nhìn xung quanh một số người, Tôi đã xem tất cả các ví dụ có số spyOn trong một số beforeEach. Vì vậy, tôi đã thay đổi thử nghiệm của mình thành:

describe("doStuff", function() { 
    var foo = new Foo(); 
    beforeEach(function() { 
     spyOn(foo, "doOtherStuff"); 
     foo.doStuff(true); 
    }); 
    it("should do stuff and other stuff", function() { 
     expect(foo.stuffDone).toBe(true); 
     expect(foo.doOtherStuff).toHaveBeenCalled(); 
    }); 
}); 

Và tính năng này hoạt động. Tôi khá mới với hoa nhài, vì vậy tôi chỉ có thể thiếu một cái gì đó hiển nhiên, nhưng tôi chỉ muốn biết tại sao nó phải ở trong một beforeEach cho spyOn để làm việc. Thật dễ dàng để chỉ sử dụng beforeEach, nhưng tôi muốn hiểu rõ hơn những gì đang diễn ra. Cảm ơn.

Trả lời

10

Điều đó đơn giản chỉ vì Jasmine chạy các thông số kỹ thuật trong một đóng cửa khác. Các cuộc gọi describeit chỉ đăng ký các cuộc gọi lại được thêm vào hàng đợi và sau đó được thực thi bởi Jasmine sau. Và Jasmine luôn dọn dẹp các gián điệp ...

Nhưng bạn cũng có thể thêm spyOn vào cuộc gọi lại it.

Các vấn đề liên quan