gpt4 book ai didi

javascript - 监视 jQuery $ ('...' ) Jasmine 中的选择器

转载 作者:行者123 更新时间:2023-11-28 05:12:15 25 4
gpt4 key购买 nike

当涉及到监视 jQuery 函数(例如 bindclick 等)时,很容易:

spyOn($.fn, "bind");

问题是当您想要监视 $('...') 并返回定义的元素数组时。

阅读其他相关答案后尝试的事情:

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

那么我该怎么做呢?或者,如果唯一的方法是监视 init 函数,那么当我完成后,如何从函数中“删除” spy ,这样 afterEach() 路由就不会中断。

jQuery 版本是 1.9.1。

解决方法:

到目前为止我可以让它工作的唯一方法(丑陋):

realDollar = $;
try {
$ = jasmine.createSpy("dollar").andReturn(elements);
// test code and asserts go here
} finally {
$ = realDollar;
}

最佳答案

通常, spy 在规范的生命周期内都存在。然而,消灭 spy 并没有什么特别的。您只需恢复原始函数引用即可。

这是一个方便的小帮助函数(带有测试用例),它将清理您的解决方法并使其更可用。在 afterEach 中调用 unspy 方法来恢复原始引用。

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);
});
});

作为上述内容的替代方案(以及对于阅读本文的其他人),您可以改变解决问题的方式。不要监视 $ 函数,而是尝试将对 $ 的原始调用提取到它自己的方法并监视它。

// 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 */));
// ...
});

关于javascript - 监视 jQuery $ ('...' ) Jasmine 中的选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41264748/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com