如何为jquery调用创建一个间谍`$(some)`?

时间:2014-09-28 07:42:01

标签: javascript jquery unit-testing jasmine spy

我定义了一个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 个答案:

答案 0 :(得分:1)

你不能直接监视jQuery选择器,因为它们每次都返回不同的对象。当你无法获得参考时,一般的Jasmine SpyOn技巧就是将间谍放在原型上。使用jQuery看起来像这样:

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

如果你愿意,你可以从间谍调用的参数中提取参数(并查看即在窗口上调用它)。

至于apply:apply是一个纯javascript方法,不是jQuery的一部分,所以你可以通过它所属的函数原型监视它:

spyOn(Function.prototype, 'apply');

(虽然我没有试过这段代码)