2014-09-28 23 views
0

我定義了一個requirejs模塊提供一個函數來獲取瀏覽器的寬度:

browserTool.js

define(['jquery'], function($) { 
    return { 
     getBrowserWidth: function() { 
      return $(window).width(); 
     } 
    } 
}); 

現在我想編寫單元測試,所以我想嘲笑jquery

define(['jquery', 'browserTool'], function(jquery, browserTool) { 
    describe("test", function() { 
     it("should do something", function() { 
     spyOn(jquery, "apply").and.returnValue({ 
      width: function() { return 300; } 
     }); 
     expect(browserTool.getBrowserWidth()).toEqual(300); 
     }); 
    }); 
}); 

你可以看到我想要使用:spyOn(jquery, "apply")嘲笑,但這種測試不能正常工作,看來我窺探一個錯誤的方法。

如何解決?

回答

1

你不能直接監視jQuery選擇器,因爲它們每次都返回不同的對象。一般的Jasmine SpyOn技巧,當你無法獲得參考時,就是把間諜放在原型上。與jQuery它看起來像這樣:

//spyOn $(window).width(): 
spyOn($.fn, 'width'). 

如果你願意,你可以提取從諜調用的參數的PARAMS(並看到即它被稱爲在窗口)。

至於申請:申請是一個純JavaScript方法,而不是jQuery的一部分,這樣你就可以通過它的函數原型可能窺探到它所屬:

spyOn(Function.prototype, 'apply'); 

(我沒有嘗試這個代碼雖然)