2013-07-26 3 views
8

У меня возникли некоторые неприятности implimenting шпионаж в Jasmineжасмин шпионы не называют

Я хочу, чтобы проверить, если ссылка была нажата на ползуне с помощью шпиона жасмин и жасмин 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') 
} 

спецификации файла:

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. Am я тестирование для такого рода вещи в неправильном направлении?
  2. Почему шпион не регистрирует тот факт, что метод был вызван?
+1

Я думаю, в этом случае вы должны * Шпион на прототипе *: 'spyOn (Slider.prototype, 'handleClick') 'и поместите этот код перед созданием' 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(); 
    }); 

}); 

Дело в том, что вы должны следить за прототип handleClick функции и перед темSlider создания.

Причина в том, что Жасмин spyOn действительно в коде вы предоставили:

spyOn(slider, 'handleClick'); 

создает слайдера свойство handleClick (содержащий объект шпион) непосредственно на экземпляре slider. slider.hasOwnProperty('handleClick') в этом случае возвращает true, вы знаете ...

Но все же существует свойство прототипа handleClick, к которому привязано ваше событие click. Это означает, что только вызванное событие click обрабатывается прототипом функции handleClick, тогда как собственное свойство объекта ползунка handleClick (ваш шпион) остается нетронутым.

Таким образом, ответ в том, что шпион не регистрирует тот факт, что этот метод был назван потому, что он никогда не был назван :-)

+0

+1 Ваше объяснение прототипа vs собственного свойства находится на месте и не упоминается нигде в документах. Огромное спасибо! – dbrin

+0

@dbrin Рад помочь =) – zbynour