如何使用Sinon存根jQuery方法?

时间:2014-05-27 23:57:35

标签: jquery ember.js coffeescript sinon chai

我在Ember View中有以下代码:

  postRender: ->
    @_super()
    @$().tooltipster({
      content: @$().data('tooltip')
      contentAsHTML: true
    })

我正在尝试测试tooltipster()postRender()执行时被调用但我在使用Sinon监视tooltipster()时遇到了一些问题。这是我到目前为止的规格:

  describe 'postRender', ->
    it 'initializes tooltips', ->
      spy = sinon.spy(view.$(), 'tooltipster')
      view.postRender()
      spy.should.be.calledOnce
      view.$().tooltipster.restore()

但是抱怨view.$()未定义。

关于如何使这项工作的任何想法?

谢谢!

2 个答案:

答案 0 :(得分:1)

我很确定你应该发送一个函数,而不是函数对sinon的间谍的反应。

spy = sinon.spy(view.$, 'tooltipster')

话虽如此,但不太可能在视图上定义$方法,而不遵循正确的约定。而且您并没有真正测试Ember设置$方法的能力,因此如果需要,您可以自行设置。像这样:

var test = false;

view.$ = function(){
  return {
    data: function(attr){
      return 'something';
    },
    tooltipster: function(hash){
      test = true;
    }
  };
}
view.postRender();
assert(test, 'tooltipster should have been called, and test is true');

答案 1 :(得分:0)

jQuery对象从$().css()对象获取$.fn之类的方法。 jQuery plugins like tooltipster are registered there, too。监视$.fn.tooltipster是你想要做的:

spy = sinon.spy view.$.fn, 'tooltipster'
view.postRender()
spy.should.be.calledOnce
spy.restore() # or view.$.fn.tooltipster.restore()