2013-07-22 5 views
3

Я пытаюсь использовать sinon.js для создания шпиона на функцию jQuery.append.Как подсмотреть функцию добавления jQuery Sinon

Я пробовал: var spy = sinon.spy($, "append"); и получил следующую ошибку: TypeError: Attempted to wrap undefined property append as function.

I после этого изменен к: var spy = sinon.spy($.fn, "append"); который кажется более лучшим, но spy.called ложно.

+0

Я переместил часть этого вопроса на новый, надеюсь, более ясный вопрос - благодаря всем тем, кто пытался мне помочь. Пожалуйста, смотрите: http://stackoverflow.com/questions/17787893/any-better-way-than-setimeout-to-wait-for-asnyc-callbacks-when-testing-javascript – davy

ответ

11

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/

+0

спасибо - обе работы $ .fn и $ .prototype - я думаю, потому что в JavaScript функции являются объектами. Я думаю, что я предпочитаю прототип. – davy

+0

как насчет того, когда внутри асинхронная функция? См. Заданный вопрос. – davy

+0

В асинхронном вызове нет проблем. См. Http://jsfiddle.net/BFG7E/ и http://jsfiddle.net/tK2Kz/. Также обратите внимание на '$ .fn === $ .prototype'. – Mics

0

Я думаю, вы не можете следить за функциями jQuery - они привязаны к каждому объекту. Он работает следующим образом:

  • Вы вызываете метод на объект jQuery.
  • jQuery проверить его на собственные $ .fn.
  • jQuery проверить для него в плагинах.

И если найдено - верните его. Если нет - ошибка. Синон здесь не сработает.

+0

спасибо. - var spy = sinon.spy ($. fn, "append"); похоже, работает - просто не в функции async. – davy

-1

Вы должны шпионить на $ и вернуть объект, который имеет функцию добавления в качестве шпиона

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

sinon not Jasmine :) - есть ли что-то подобное? – davy

+0

К сожалению, обновил мой ответ –

+0

@ AndreasKöberle это все же запутанно на самом деле - первая строка о шпинге жасмина, вторая - о силоне – shabunc

2

Я понимаю, что этот вопрос старый, но у меня была аналогичная проблема и я нашел решение.

Я попробовал один из предложенных выше.

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: Возможно, это не относится к данному вопросу. Но то, что я пытаюсь сделать, это инициировать фокусное событие в карма-бегуне.Пока что я был неуспешен (событие click действительно работает). Для этого я поставил вопрос о StackOverflow.