【问题标题】:Should JavaScript Event Handlers Be Unit TestedJavaScript 事件处理程序是否应该进行单元测试
【发布时间】:2014-12-31 02:19:48
【问题描述】:

这里有很多关于其他语言的单元测试事件处理程序的问题,但我一直无法找到关于 JavaScript 的好的答案。具体来说,我说的是这样一个案例:

// inside a "view" class definition:
handleCheckboxClick: function() {
    this.relevantData.toggleSomeValue();
    return false;
}

// later on:
$('#someCheckbox').on('click', view.handleCheckboxClick);

显然,事件处理程序 (this.relevantData.toggleSomeValue()) 中有逻辑,但同时没有其他方法会调用此处理程序,因此它不像单元测试那样会捕获一些未来与重构相关的错误。在任何给定的 JavaScript 代码库中,都有很多这样的处理程序,因此测试它们的工作量并不小。

另外,在许多 JS 商店(当然是我们的)中,也有使用 Selenium 进行的功能级测试,这些测试通常会发现明显的 UI 问题(例如事件处理程序中断时)。

所以,一方面我得到了“逻辑单元测试 == 好”,而且我不想因为以后支付费用而不测试某些代码而自取其辱。另一方面,当涉及到单元测试时,这个特定的代码子集似乎具有高成本和低价值。因此,我对 SO 社区的问题是,JS 开发人员是否应该对他们的事件处理功能进行单元测试?

【问题讨论】:

  • 单元测试是娘炮,写出有效的代码!换句话说,我认为对简单事件处理程序进行单元测试是浪费时间。
  • @adeneo 从单元测试的角度来看,事件处理程序与其他代码有何不同?
  • (尽管我之前有评论,但我认为这是一个更好的情况,可以通过 UI / 集成测试来选择。)
  • 嗯,我不太关心单元测试,但我确实将它用于可能存在设计缺陷的大型项目。对于一些 jQuery 事件处理程序,没有那么多(根本不是真的)!
  • 请不要将函数命名为handleCheckboxClick。以它们的作用命名函数,而不是它们的使用方式。在这种情况下,toggleRelevantData 可能是一个更好的名称。

标签: javascript unit-testing


【解决方案1】:

这绝对属于意见问题,但我会继续提供我的:)

根据我的经验,在单元级别测试这样的处理程序并不划算。我通常最终会花费大量时间站立固定装置并触发人为事件;这导致通过测试,但对我的视图在现实世界中能否正常运行几乎没有信心(这也不是很有趣)。我发现所有这些时间都花在其他地方要好得多。

某种覆盖率很重要,我尝试通过以下方法来实现:

  1. 将处理程序中的复杂逻辑移动到可以单独测试的辅助函数中。理想情况下,它们足够“纯”,可以在单元环境中轻松测试。如果它们不容易测试,请忘记它们!
  2. 依靠集成测试来测试与您的视图的交互。这是测试各种交互式场景的最简单的地方,例如“当我在 textarea 中输入一条消息并按下回车键时,会出现一条新消息”,无需人工触发交互的头痛。并不是说编写 selenium 测试是我的美好时光;)
  3. 放松。 覆盖率最好根据测试的功能来衡量,而不是测试的方法/处理程序。如果您确信您对应用程序交互所做的假设已“涵盖”(以某种方式或另一种方式),那么您已经完成了您的工作。

这并非适用于所有应用程序或团队,但事实证明它对我参与过的团队和应用程序来说是最有效的。我很想听听其他人对此事的看法。

【讨论】:

  • 我喜欢这个答案。诚实的测试覆盖是最好的测试覆盖!
猜你喜欢
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多