2013-07-26 30 views
8

Tôi đang gặp một số rắc rối khi gián điệp trong JasmineCác gián điệp hoa nhài không được gọi là

Tôi muốn kiểm tra xem một liên kết đã được nhấp vào thanh trượt bằng cách sử dụng một gián điệp hoa nhài và jasmine jquery.

Đây là phiên bản đơn giản:

Tôi có một số liên kết như một phần của tệp cố định html.

<a href="#" class="someLink">Link 1</a> 
<a href="#" class="someLink">Link 2</a> 

trượt:

var Slider = function(links){ 
    this.sliderLinks = $(links); 
    this.bindEvents(); 
} 

Slider.prototype.bindEvents = function(){ 
    this.sliderLinks.on('click', this.handleClick); 
} 

Slider.prototype.handleClick = function(e){ 
    console.log('i have been clicked') 
} 

đặc tả file:

describe('Slider', function(){ 
    var slider; 

    beforeEach(function(){ 
     loadFixtures('slider.html'); 

     slider = new Slider('.someLink'); 

    }); 

    it('should handle link click', function(){ 
     spyOn(slider, 'handleClick'); 
     $(slider.sliderLinks[0]).trigger('click'); 
     expect(slider.handleClick).toHaveBeenCalled(); 
    }); 

}); 

Xét nghiệm này được không. Nhưng 'tôi đã được nhấp' đã được ghi vào bàn điều khiển để phương thức này đang được gọi.

Nếu tôi làm điều này kiểm tra đi mặc dù:

it('should handle link click', function(){ 
     spyon(slider, 'handleClick'); 
     slider.handleClick(); 
     expect(slider.handleClick).toHaveBeenCalled(); 
    }); 

Vì vậy, câu hỏi của tôi về cơ bản là:

  1. Am i thử nghiệm cho loại điều một cách sai lầm?
  2. tại sao gián điệp không đăng ký thực tế là phương pháp đã được gọi?
+1

Tôi đoán trong trường hợp này bạn nên * theo dõi nguyên mẫu *: 'spyOn (Slider.prototype, 'handleClick') 'và đặt mã này trước khi tạo' Slider' 'new Slider (...)' (như @EliranMalka đã nhận xét). Bạn đã thử cái này chưa? – zbynour

Trả lời

17

Tôi vừa xác minh giải pháp được nêu trong nhận xét. describe của bạn nên là:

describe('Slider', function() { 

    var slider; 

    beforeEach(function() { 
     loadFixtures('slider.html'); 
     spyOn(Slider.prototype, 'handleClick'); 
     slider = new Slider('.someLink'); 
    }); 

    it('should handle link click', function(){ 
     $(slider.sliderLinks[0]).trigger('click'); 
     expect(slider.handleClick).toHaveBeenCalled(); 
    }); 

}); 

Vấn đề là bạn phải do thám nguyên mẫu handleClick chức năng và trước việc tạo Slider.

Lý do là gì Jasmine spyOn thực sự trong các mã mà bạn cung cấp:

spyOn(slider, 'handleClick'); 

tạo bất động sản trượt handleClick (chứa đối tượng gián điệp) trực tiếp trên slider dụ. slider.hasOwnProperty('handleClick') trong trường hợp này trả về true, bạn biết đấy ...

Nhưng vẫn còn, có handleClick thuộc tính mẫu mà sự kiện nhấp chuột của bạn bị ràng buộc. Điều đó có nghĩa là sự kiện kích hoạt chỉ được kích hoạt được xử lý bởi hàm handleClick nguyên mẫu trong khi thuộc tính sở hữu của đối tượng thanh trượt handleClick (điệp viên của bạn) vẫn bị ảnh hưởng. Vì vậy, câu trả lời là gián điệp không đăng ký thực tế là phương pháp đã được gọi vì nó chưa bao giờ được gọi là :-)

+0

+1 lời giải thích của bạn về nguyên mẫu so với tài sản của riêng là tại chỗ và không được đề cập ở bất kỳ đâu trong tài liệu. cảm ơn rất nhiều! – dbrin

+0

@dbrin Rất vui được trợ giúp =) – zbynour

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