2013-04-08 4 views
1

Я хотел бы знать, могу ли я заглянуть в функцию $ jQuery с помощью Jasmine.

Это код, который я хочу проверить.

var Wrapper = Wrapper || {}; 
Wrapper.Controls = {}; 
/** 
* Use an anonymous function to initialize all JavaScript 
*/ 

(function($) { 
    Wrapper.Controls.Utils = function() { 
     var external = { 
      showHide : function(namespace, controlNameStem){ 
       var stem = namespace + controlNameStem; 
       $(stem + 'Controller').click(); 
      } 
     }; 
     return external; 
    }; 
    return Wrapper.Controls.Utils; 
}(Wrapper.jQuery)); 

Wrapper.jQuery находится в отдельном файле, который предварительно загруженным на жасмин перед загрузкой обертке. Он содержит окурок JQuery, который определяется как этот

var aliasjQuery = {}; 

var Wrapper = Wrapper || {}; 
Wrapper.jQuery = aliasjQuery; 

Это означает, что, когда обертка инициализируется, aliasjQuery является объект, переданный в анонимной функции, как Wrapper.jQuery

Мой жасмин тест спецификации выглядит следующим образом:

describe("form control utils", function(){ 

var controlUtils = Wrapper.Controls.Utils(); 
var namespace = 'pluto_namespace'; 
var controlName = 'dualNationality'; 


it("showHide fires click event on controlNameController", function(){ 
    var control = { click : function(){}}; 
    spyOn(aliasjQuery, '$').andReturn(control); 
    spyOn(control, 'click'); 
    controlUtils.showHide(namespace, controlName); 
    expect(control.click).toHaveBeenCalled(); 
}); 



}); 

Я приветствую любые комментарии, даже те, которые похожи на то, что «почему вы хотите это сделать?» и альтернативные решения, как я думаю, я слишком долго смотрел на это.

+0

Просто примечание '$ (selector) .click()' не добавляет событие click, оно вызывает событие click. Чтобы добавить его, вы должны передать обработчик в качестве параметра. –

+0

Да, настоящий код добавит событие щелчка, но пока я надеюсь, что это иллюстрирует проблему ОК. –

+0

Ваша примерная программа просто сбивает меня с толку, потому что она не делает то, что вы говорите, что она делает для этого, и ни в коем случае не вижу, что вы действительно захватываете ссылку на jQuery. Хотя это просто придирчиво, я не могу взять ваш код и использовать его в любом месте, чтобы проверить его, не исправляя эти проблемы на моем конце. –

ответ

0

Вместо этого

var aliasjQuery = {}; 

я могу создать функцию шпиона, как так

var aliasjQuery = jasmine.createSpy(); 

и затем он возвращает управление окурок как этот

aliasjQuery.and.returnValue(control); 

так, то я могу сделать это

expect(aliasjQuery).toHaveBeenCalledWith('pluto_namespacedualNationality'); 
3

Вы уже пробовали spyOn(window, "$")?

+0

Что такое $ в контексте окна? Я передаю jQuery в свой объект Wrapper (что мне нужно сделать, чтобы избежать конфликтов с версией jQuery в приложении портлета), поэтому глобальный $ не существует. –

+0

Что я могу сделать, например, spyOn ($, "getJSON"), и это отлично работает. Но я хочу следить за $, чтобы я мог высмеивать $ (stem + 'Controller'). –

+1

spyOn (window, "$") дает мне это: function (селектор, контекст) {// Объект jQuery на самом деле является только конструктором init «расширенным», возвращающим новый jQuery.fn.init (селектор, контекст, rootjQuery); }() не существует –

Смежные вопросы