1

我在 Ember 视图中有以下代码:

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

我正在尝试测试执行tooltipster()时调用的方法,postRender()但我在监视tooltipster()Sinon 时遇到了一些麻烦。到目前为止,这是我的规格:

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

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

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

谢谢!

4

2 回答 2

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');
于 2014-05-28T00:29:11.640 回答
0

$().css()jQuery 对象从对象中获取方法$.fn像 tooltipster 这样的 jQuery 插件也在那里注册。监视$.fn.tooltipster是您想要做的:

spy = sinon.spy view.$.fn, 'tooltipster'
view.postRender()
spy.should.be.calledOnce
spy.restore() # or view.$.fn.tooltipster.restore()
于 2014-05-30T17:44:24.280 回答