3

我正在尝试使用sinon.js该功能创建间谍jQuery.append

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

然后我修改为:var spy = sinon.spy($.fn, "append");这似乎更好,但这spy.called是错误的。

4

4 回答 4

14

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/

于 2013-07-22T10:41:35.367 回答
3

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

我尝试了上面建议的其中一个答案。

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:这可能与这个问题无关。但是我一直在尝试做的是在 karma-runner 中触发一个焦点事件。到目前为止,我一直没有成功(但是点击事件确实有效)。为此,我将在 StackOverflow 上发布一个问题。

于 2016-04-08T12:23:10.200 回答
0

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

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

如果找到 - 归还。如果不是 - 错误。诗乃不会在这里工作。

于 2013-07-22T10:34:39.497 回答
-1

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

var spy = jasmine.createSpy();
sinon.spy(window, "$").returns({append: spy})
于 2013-07-22T10:44:58.837 回答