2012-01-10 21 views
49

Tôi mới bắt đầu sử dụng Jasmine vì vậy hãy tha thứ cho câu hỏi newbie nhưng có thể kiểm tra các loại đối tượng khi sử dụng toHaveBeenCalledWith không?Sử dụng các loại đối tượng với phương thức Jasmine's toHaveBeenCalledWith

expect(object.method).toHaveBeenCalledWith(instanceof String); 

Tôi biết tôi có thể làm điều này nhưng nó kiểm tra giá trị trả lại thay vì đối số.

expect(k instanceof namespace.Klass).toBeTruthy(); 

Trả lời

43

toHaveBeenCalledWith là một phương pháp gián điệp. Vì vậy, bạn chỉ có thể gọi cho họ về điệp viên như được mô tả trong docs:

// your class to test 
var Klass = function() { 
}; 

Klass.prototype.method = function (arg) { 
    return arg; 
}; 


//the test 
describe("spy behavior", function() { 

    it('should spy on an instance method of a Klass', function() { 
    // create a new instance 
    var obj = new Klass(); 
    //spy on the method 
    spyOn(obj, 'method'); 
    //call the method with some arguments 
    obj.method('foo argument'); 
    //test the method was called with the arguments 
    expect(obj.method).toHaveBeenCalledWith('foo argument'); 
    //test that the instance of the last called argument is string 
    expect(obj.method.mostRecentCall.args[0] instanceof String).toBeTruthy(); 
    }); 

}); 
+1

Andreas, là có bất kỳ lý do bạn thêm '.toBeTruthy() '? Có vẻ như không cần thiết. – gwg

+1

@gwg 'mong đợi (foo)' mà không có đối sánh là một no-op; dòng sẽ không làm gì nếu không có cuộc gọi 'toBeTruthy()'. Xem http://jsfiddle.net/2doafezv/2/ để lấy bằng chứng. –

+4

Đây là lỗi thời; 'obj.method.mostRecentCall' cần trở thành [' obj.method.calls.mostRecent() '] (http://jasmine.github.io/2.0/introduction.html#section-Other_tracking_properties) trong Jasmine 2.0. Ngoài ra, sử dụng 'jasmine.any()', như được mô tả trong câu trả lời khác, rõ ràng hơn và dễ thương hơn. Cuối cùng, câu trả lời này mất một thời gian để đạt được điểm; về cơ bản tất cả mọi thứ bạn đã viết bên cạnh 'mong đợi (obj.method.mostRecentCall.args [0] instanceof String) .toBeTruthy();' không thực sự cần thiết để tự giải thích. –

84

tôi đã phát hiện ra một cơ chế thậm chí mát, sử dụng jasmine.any(), như tôi đã tìm lấy đối số cách nhau bằng tay là phụ tối ưu cho mức độ dễ đọc.

Trong CoffeeScript:

obj = {} 
obj.method = (arg1, arg2) -> 

describe "callback", -> 

    it "should be called with 'world' as second argument", -> 
    spyOn(obj, 'method') 
    obj.method('hello', 'world') 
    expect(obj.method).toHaveBeenCalledWith(jasmine.any(String), 'world') 
+16

jasmine.any (Chức năng) rất tiện dụng, quá –

+1

Nhận thấy rằng nó cũng hoạt động bên trong tham chiếu. ví dụ: 'mong đợi (obj.method) .toHaveBeenCalledWith ({done: jasmine.any (Function)})'. Rất hữu dụng. – fncomp

+1

đây là câu trả lời đúng. – Cam

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