我定义了一个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")
来模拟,但这个测试不起作用,似乎我发现了一个错误的方法。
如何修复?
您不能直接监视jQuery选择器,因为它们每次都返回不同的对象。当你找不到参考资料时,Jasmine SpyOn的一个通用技巧是将间谍放在原型上。使用jQuery,它看起来像这样:
//spyOn $(window).width():
spyOn($.fn, 'width').
如果你想,你可以从间谍调用的参数中提取params(并查看它是在窗口中调用的)。
至于apply:apply是一个纯javascript方法,而不是jQuery的一部分,因此您可能可以通过它所属的函数原型来监视它
spyOn(Function.prototype, 'apply');
(不过我没有尝试这个代码)