2013-07-26 96 views
8

我有在茉莉花茉莉花間諜沒有被調用

一些麻煩implimenting刺探我要檢查,如果一個鏈接被點擊上使用間諜茉莉花和茉莉花jQuery的滑塊。

下面是一個簡化版本:

我有一些鏈接爲html固定文件的一部分。

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

滑塊:

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') 
} 

spec文件:

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

}); 

測試失敗。但'我已被點擊'已被記錄到控制檯,因此該方法正在被調用。

如果我做這個測試通過,但:

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

所以我的問題本質上是:

  1. 我是測試在錯誤的方式這種類型的東西?
  2. 爲什麼間諜沒有註冊該方法被調用的事實?
+1

我在這種情況下想你應該*對樣機諜*:'spyOn (Slider.prototype,'handleClick')',並把這個代碼放在'Slider'創建'新Slider(...)'之前(如@EliranMalka所評論的)。你試過這個嗎? – zbynour

回答

17

我剛剛驗證了評論中概述的解決方案。你describe應該是:

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

}); 

的一點是,你必須的Slider創建之前原型​​功能和間諜。

的原因是什麼茉莉花spyOn確實在您提供的代碼:

spyOn(slider, 'handleClick'); 

創建直接在slider實例滑塊財產​​(含間諜對象)。 slider.hasOwnProperty('handleClick')在這種情況下返回true,你知道...

但是,仍然有​​原型屬性,您的click事件被綁定。這意味着觸發的單擊事件由原型​​函數處理,而滑塊對象自己的屬性​​(您的間諜)保持不變。

所以答案是間諜是不登記的事實,方法被調用,因爲它從來沒有被稱爲:-)

+0

+1您對原型與自己的財產的解釋是現貨,並且在文檔中的任何地方都沒有提及。非常感謝! – dbrin

+0

@dbrin很高興幫助=) – zbynour