2016-11-24 5 views
0

Я хочу следить за функцией, используемой в качестве обработчика щелчка. Функция определена внутри конструктора замыкания.Jasmine spy не работает над функцией, определенной в конструкторе

var viewModel = function(){ 
    var viewModel = function(){ 
    var _this = this; 
    _this.internalClickHandler = function(){ 
     console.log('I handled a click'); 
    } 
    } 
    return viewModel; 
}(); 

var testViewModel = new viewModel(); 
var theSpy = spyOn(testViewModel, 'internalClickHandler'); 

Несмотря на то, жасмин счастлив, что 'internalClickHandler существует и создает шпиона, он никогда не будет вызван. Фактически исходная функция (internalClickHandler) получает вызов вместо этого.

Я создал examples in codepen.io, которые показывают проблему. Пробный тест - это попытка попытаться найти функцию в конструкторе.

Мой обработчик событий должен находиться в конструкторе, так как ему нужен доступ к экземпляру объекта, и я хочу проверить, что правильный обработчик был уволен не только, что был вызван событие клика.

Любая помощь будет приниматься в значительной степени. Благодаря

ответ

0

Я решил это, используя в качестве обработчика анонимную функцию, обернутую ссылкой на internalClickHandler. Таким образом, функция по-прежнему вызывает вызов, и я могу следить за ней.

var viewModel = function(){ 
    var viewModel = function(){ 
    var _this = this; 
    _this.internalClickHandler = function(){ 
     console.log('I handled a click'); 
    } 
    } 
    return viewModel; 
}(); 

var theViewModel = new viewModel(); 
var theSpy = spyOn(testViewModel, 'internalClickHandler'); 

$('#testLink').on('click', 
function(){ 
    theViewModel.internalClickHandler(); //<-- The anonymous function calls internalClickHandler 
}); 
0

Вы не сможете выполнить этот тест из-за следующих причин:

  1. Ваш clickHandler фактически получает переназначен на другой переменной на DOM Element OnClick см эта линия document.getElementById('testLink').addEventListener('click', _this.internalClickHandler);
  2. Когда вызывается триггер щелчка, он фактически выполняет функцию onClick и NOT internalClickHandler, хотя они действительны (код мудрый) то же самое, но на них ссылаются две разные переменные i.e onClick & internalClickHandler.
  3. Вам лучше попробовать что-то подобное.

    it('should spy on a event binding defined in constructor', function() { 
        var testViewModel = new viewModel(); 
        var tl = document.getElementById('testLink'); 
        var theSpy = spyOn(t1, 'onclick'); 
        //$('#testLink').trigger('click'); 
    
        var event = new MouseEvent('click', { 
        'view': window, 
        'bubbles': true, 
        'cancelable': true 
        }); 
    
        tl.dispatchEvent(event); 
        expect(theSpy).toHaveBeenCalled(); 
        tearDown(); 
    }); 
    

Надеется, что это помогает.

+0

Спасибо за ответ, вы посоветуете мне помочь в решении и, надеюсь, тоже помогут кому-то еще. Вы правы, что вызывается функция onclick, а не функция в конструкторе. Однако ваше решение не помогает мне создать полезный тест, так как я только знаю, что обработчик onclick был обработан, но я не знал, что с ним справится. Я разместил свое решение, которое позволяет мне следить за функцией в конструкторе. – moefinley

+0

Если вы считаете, что этот ответ помогает понять концепцию издевательств над кликом/проводниками в сторону положительного решения, вам поможет upvote. –