2013-09-11 4 views
1

Я новичок в тестировании JavaScript и столкнулся с проблемой при попытке использовать sinon.js для отслеживания существующих функций.Использование sinon.js spy() для обертывания существующей функции

Скажем, у меня есть функция под названием

nsClientInfectionControlIndex.handleEditButton(); 

, который выглядит как

var nsClientInfectionControlIndex = { 

showQtipError : function (message) 
{ 
    ///<summary>Shows qTip error on edit button</summary> 
    ///<param name="message">The text message to be displayed</param> 
    $("#editBtn").qtip(nsCBS.ErrorTip(message )).qtip("show"); 
}, 

goToEditPage : function (id) 
{ 
    ///  <summary>Navigates browser window to edit page</summary> 
    ///  <param name="id">The data-id (Client Infection Control Id) attribute from selected row</param> 
    var url = '/ClientInfectionControl/ClientInfectionControl/' 
    window.location.href = url + "?id=" + id; 
}, 

handleEditButton: function() { 
    var id = $(".selectedRow").attr("data-id"); 
    if (id != null) { 
     nsClientInfectionControlIndex.goToEditPage(id); 
    } else { 
     nsClientInfectionControlIndex.showQtipError("Please select a Client Infection Control Note first."); 
    } 
}, 

}; 

Сейчас в моем test.js я использовал следующий код

var errorSpy = sinon.spy(nsClientInfectionControlIndex.showQtipError); 

//Act 
nsClientInfectionControlIndex.handleEditButton(); 

//Assert 
equal(errorSpy.called, true, "test"); 

И тест не пройден (возвращает false), хотя я ожидал бы истинного, потому что вызывается nsClientInfectionControlIndex.showQtipError.

Хотя, насколько я понимаю документацию Sinon, я правильно слежу за своей функцией, включив функцию в конструктор. http://sinonjs.org/docs/#sinonspy

я могу заставить его работать правильно, если я подхожу Шпион таким образом,

var errorSpy = sinon.spy(); 
nsClientInfectionControlIndex.showQtipError = errorSpy; 

//Act 
nsClientInfectionControlIndex.handleEditButton(); 

//Assert 
equal(errorSpy.called, true, "test"); 

Однако это заменяет оригинальную функциональность метода. Подхожу ли я к этому неправильно? Любая помощь будет оценена по достоинству.

+0

Этот пример - беспорядок. подумайте над созданием чего-то более читаемого в следующий раз. – jhohlfeld

ответ

3

При шпионаже на функции объекта вы должны указывать имя объекта и функции отдельно, а не фактическую функцию. Это позволяет Синону заменять реальную функцию шпионом.

var errorSpy = sinon.spy(nsClientInfectionControlIndex, "showQtipError"); 

Предупреждения: Если какой-либо код сохраняет функцию в переменную перед тем настройки шпиона, он будет обходить шпион.

// before test runs 
var callback = nsClientInfectionControlIndex.showQtipError; 

// in test 
var errorSpy = ... 

// activated by test 
callback(); <-- bypasses spy 
Смежные вопросы