JavaScript事件处理程序是否应进行单元测试

时间:2014-12-31 02:19:49

标签: javascript unit-testing

这里有很多关于其他语言的单元测试事件处理程序的问题,但在JavaScript方面我还没有找到一个好的答案。具体来说,我在谈论一个案例:

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

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

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

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

所以,一方面我得到了#34;逻辑的单元测试==好",如果我付钱,我不想通过不测试某些代码来自责为了它以后。另一方面,当涉及单元测试时,这个特定的代码子集似乎具有高成本和低价值。因此,我对SO社区的问题是,JS开发人员应该对其事件处理函数进行单元测试吗?

1 个答案:

答案 0 :(得分:4)

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

根据我的经验,在单元级别测试这样的处理程序并不符合成本效益。我通常最终花费大量时间站起来并引发人工事件;这会导致通过测试,但对我的视图在现实世界中正常运行的信心不大(它也不是很有趣)。我发现在其他地方花费的时间要好得多。

某种覆盖 非常重要,我尝试使用以下方法实现这一目标:

  1. 将处理程序中的复杂逻辑移动到可以单独测试的辅助函数。理想情况下,这些是纯粹的"足以让他们在单位环境中轻松测试。如果它们不容易测试,请忘记它们!
  2. 依靠集成测试来测试与您的观看次数的互动。这是测试各种互动场景的最简单的地方,例如"当我在textarea中输入一条消息并按回车键时,会出现一条新消息",而不会人为地触发交互。不是写硒测试是我对美好时光的想法;)
  3. 放松。覆盖率最好用测试的功能测量,而不是测试的方法/处理程序。如果您确信您对应用程序的交互所做出的假设已被覆盖" - 以这种或那种方式 - 然后你已经完成了你的工作。
  4. 对于所有应用程序或团队来说并非如此,但事实证明,对于我所工作的团队和应用程序来说,它是最有效的。我有兴趣听听别人对此事的看法。