2011-10-12 53 views
4

我如何測試某個JQuery選擇器是否已經與Jasmine一起執行?我試圖做到以下幾點:如何用Jasmine模擬JQuery?

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看爲好。

+0

你可以提供你的代碼爲spyOn和期待?另外,你的最後一段有點難以理解。你可以試着擴大/澄清它嗎? – machineghost

+0

@machineghost,增加了一個例子,希望它有幫助 – Fluffy

+0

嗯,你試過期待($ .fn.init).toHaveBeenCalled(); ? – machineghost

回答

3

那麼它看起來像茉莉它通過替換的間諜東西暗中監視,與包裝版本的對象,這似乎是搞亂了的jQuery作爲一個整體,因爲(從jQuery源代碼):

// jQuery對象實際上只是在init構造「加強」

我建議試圖刺探的init使用的功能之一,特別是「合併」。如果你看一下jQuery的代碼,你會發現任何HTML => DOM的東西最終獲得通過合併調用返回:

return jQuery.merge(this, selector); 

(這是行152,如果你碰巧在看的jQuery 1.5的源0.1)。

通過監視合併,您應該能夠測試您正在測試的任何內容,而不會無意中替換jQuery的內容。