par*_*ier 10 javascript jquery unit-testing mocking jasmine
当谈到刺探jQuery的功能(例如bind,click等)很容易:
spyOn($.fn, "bind");
Run Code Online (Sandbox Code Playgroud)
问题是当您想要监视$('...')并返回已定义的元素数组时.
在SO上阅读其他相关答案后尝试了一些事情:
spyOn($.fn, "init").andReturn(elements); // works, but breaks stuff that uses jQuery selectors in afterEach(), etc
spyOn($.fn, "merge").andReturn(elements); // merge function doesn't seem to exist in jQuery 1.9.1
spyOn($.fn, "val").andReturn(elements); // function never gets called
Run Code Online (Sandbox Code Playgroud)
那我该怎么做?或者,如果唯一的方法是监视init函数,当我完成时如何从函数中"删除"间谍,这样afterEach()路由不会中断.
jQuery版本是1.9.1.
解决方法:
到目前为止我唯一可以使它工作的方式(丑陋):
realDollar = $;
try {
$ = jasmine.createSpy("dollar").andReturn(elements);
// test code and asserts go here
} finally {
$ = realDollar;
}
Run Code Online (Sandbox Code Playgroud)
通常情况下,间谍存在于规范的生命周期中.然而,摧毁间谍并没有什么特别之处.您只需恢复原始功能参考即可.
这是一个方便的小助手功能(带有测试用例),可以清理你的解决方法并使其更加实用.调用unspy您的方法afterEach以恢复原始引用.
function spyOn(obj, methodName) {
var original = obj[methodName];
var spy = jasmine.getEnv().spyOn(obj, methodName);
spy.unspy = function () {
if (original) {
obj[methodName] = original;
original = null;
}
};
return spy;
}
describe("unspy", function () {
it("removes the spy", function () {
var mockDiv = document.createElement("div");
var mockResult = $(mockDiv);
spyOn(window, "$").and.returnValue(mockResult);
expect($(document.body).get(0)).toBe(mockDiv);
$.unspy();
expect(jasmine.isSpy($)).toEqual(false);
expect($(document.body).get(0)).toBe(document.body);
});
});
Run Code Online (Sandbox Code Playgroud)
作为上述内容的替代方案(以及其他阅读此内容的人),您可以改变接近问题的方式.而不是监视$函数,尝试将原始调用解压缩$到自己的方法,然后监视它.
// Original
myObj.doStuff = function () {
$("#someElement").css("color", "red");
};
// Becomes...
myObj.doStuff = function () {
this.getElements().css("color", "red");
};
myObj.getElements = function () {
return $("#someElement");
};
// Test case
it("does stuff", function () {
spyOn(myObj, "getElements").and.returnValue($(/* mock elements */));
// ...
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10462 次 |
| 最近记录: |