如何监视jQuery's附加函数Sinon

How to spy on jQuery's append function Sinon

本文关键字:Sinon 函数 何监视 监视 jQuery      更新时间:2023-09-26

我正试图使用sinon.jsjQuery.append函数上创建一个间谍。

我尝试了:var spy = sinon.spy($, "append");,但得到以下错误:TypeError: Attempted to wrap undefined property append as function

然后我修改为:var spy = sinon.spy($.fn, "append");,这看起来更好,但spy.called是假的。

Sinon.spy(object, "method")需要一个对象作为第一个参数,但$是一个函数。你应该像这样监视$.prototype

var spy = sinon.spy($.prototype, "append");

小提琴:http://jsfiddle.net/RZ825/

或者你可以像这样监视单个对象:

var spy = sinon.spy($("body"), "append");

小提琴:http://jsfiddle.net/G5J8H/

我意识到这个问题很老了,但我也遇到了类似的问题,并找到了解决方案

我尝试了上面建议的一种方法。

var spy = sinon.spy($("body"), "append");

我的版本:

var spy = sinon.spy($("#id"), "function");

然而,这并没有奏效,我花了一些时间才弄清楚原因。事实证明,您需要访问jQuery对象之后的数组。

像这样:

var spy = sinon.spy($("#id")[0], "function");

Sinon对jQuery对象本身不做任何操作,因为它可以包含多个值,而且它不知道您想要哪个值(即使只有一个)。

PS:我注意到这不适用于所有jquery函数。对我来说,这是为了"专注"。PPS:这可能与这个问题无关。但我一直想做的是在因果报应跑步者中触发一个焦点事件。到目前为止,我一直不满意(不过点击事件确实有效)。我将在StackOverflow上为此发布一个问题。

我认为你不能监视jQuery函数——它们绑定到每个对象。它是这样工作的:

  • 您在jQuery对象上调用方法
  • jQuery在自己的$.fn中检查它
  • jQuery在插件中检查它

如果找到-返回。如果没有-错误。西农不会在这里工作。

您必须监视$并返回一个具有附加功能的对象作为间谍

var spy = jasmine.createSpy();
sinon.spy(window, "$").returns({append: spy})