【问题标题】:Testing that a function will not be called in CoffeeScript (and JS)测试一个函数不会在 CoffeeScript(和 JS)中被调用
【发布时间】:2012-03-03 21:21:01
【问题描述】:

我有一个名为render 的函数,它在CoffeeScript 中有以下代码。这是一个 Backbone 视图,如果定义了一个函数,则只调用 afterRender 函数,如下所示:

@afterRender() if @afterRender

如果 afterRender 不存在,我如何测试它不会被调用?

这是阳性测试:

it 'calls afterRender when defined', ->
  called = false
  @view.afterRender = -> called = true
  @view.render()
  expect(called).toBeTruthy()

但是我试图想出一个好的测试方法的一切都失败了。

我正在使用 sinon.js,所以如果您认为它会有所帮助,我可以使用它的间谍、模拟和存根。

有什么想法吗?

【问题讨论】:

  • @afterRender() if @afterRender 行在render 方法中?
  • 嘿@TrevorBurnham,很抱歉省略了这个信息。是的,是的!

标签: testing backbone.js coffeescript


【解决方案1】:

您可以使用mock 来测试您的两种情况——在第一种情况下它被调用一次(您当前手动使用called 变量执行的操作),而在第二种情况下它从未被调用:

第一种情况:

sinon.mock(@view).expects('afterRender').once()
@view.render()

第二种情况:

sinon.mock(@view).exepcts('afterRender').never()
@view.render()

【讨论】:

  • 我以前试过。我得到TypeError: Attempted to wrap undefined property afterRender as function。显然我不能对一个不存在的函数抱有期望(并且测试需要它不存在)
  • 在这种情况下,为什么不直接测试@view.afterRenderundefined?但是,我想你最好总是定义方法,然后除非你需要,否则不要调用它(对我来说这似乎是一个更好的设计)。
  • 实际上,我想这不会测试您想要测试的内容(如果调用了函数,而不是未定义,即使它们是等价的)。在这种情况下,您不能使用您设置的相同called 测试并检查它是否为假而不是真?我仍然认为不定义函数是个坏主意(请参阅我之前的评论)。
猜你喜欢
  • 2016-11-16
  • 1970-01-01
  • 2016-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-03
  • 2017-03-27
  • 2011-04-18
相关资源
最近更新 更多