Как издеваться над JQuery с Жасмин? - PullRequest
4 голосов
/ 12 октября 2011

Как я могу проверить, что определенный селектор JQuery был выполнен с Jasmine? Я пытаюсь сделать следующее:

spyOn($.fn, 'init').andCallThrough(); 
// my code
expect($.init).toHaveBeenCalled();

Но после этого вызова $('div') возвращает Object { selector="div", context=document, NaN=div.spec, more...}, хотя он должен вернуть (а $.fn.init('div') возвращает его): [div.jasmine_reporter, div.banner, div.logo, 4 more...]. Этот материал естественным образом нарушает код, поскольку объект JQuery больше не может использоваться.

Пример:

Скажем, я хочу проверить, что был вызван селектор JQuery, я пишу:

    it('tests', function() {
        spyOn($.fn, 'init').andCallThrough();
        $('html');
        expect($.init).toHaveBeenCalled();
    });

Этот результат - ошибка от Жасмин: Error: Expected a spy, but got undefined.. Затем я устанавливаю точку останова в FireBug на строке $ ('html') и, когда попадаю туда и пытаюсь посмотреть, каково значение $('html'), получаю:

Object { selector="html", context=document, NaN=html, more...}

Если я закомментирую spyOn, в этой строке $('html') будет иметь значение:

[html]

Что я и ожидал увидеть с spyOn.

1 Ответ

3 голосов
/ 13 октября 2011

Похоже, что Jasmine выполняет свои шпионские функции, заменяя подсмотренный объект упакованной версией, и это, похоже, портит jQuery в целом, поскольку (из исходного кода jQuery):

// Объект jQuery на самом деле является просто «усовершенствованным» конструктором init

Я бы предложил попытаться шпионить за одной из функций, которые использует init, а именно за «слияние».Если вы посмотрите на код jQuery, то увидите, что любой HTML => DOM материал в конечном итоге возвращается через вызов слияния:

return jQuery.merge( this, selector );

(это строка 152, если вы случайно посмотрите на источникjQuery 1.5.1).

Следя за слиянием, вы сможете протестировать все, что тестируете, без непреднамеренной замены кишок jQuery.

...