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

5

这里有很多关于其他语言中单元测试事件处理程序的问题,但是当涉及到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开发人员应该对其事件处理函数进行单元测试吗?


1
单元测试是给懦夫用的,写出能正常工作的代码才是王道!换句话说,我认为对于简单的事件处理程序进行单元测试是浪费时间。 - adeneo
@adeneo 从单元测试的角度来看,事件处理程序与其他代码有何不同? - user2864740
尽管我之前的评论,但我认为这是一个更好的情况,可以通过UI/集成测试来解决。 - user2864740
1
嗯,我并不是很在意单元测试,但对于可能存在设计缺陷的大型项目,我会使用它。对于一些 jQuery 事件处理程序,就不太需要(实际上根本不需要)! - adeneo
@adeneo 我不喜欢写单元测试。我希望我的项目有更多的单元测试。D: - user2864740
1
请不要将函数命名为 handleCheckboxClick 这样的东西。应该根据函数的作用而非使用方式来命名函数。在这种情况下,toggleRelevantData 可能是一个更好的名称。 - George Mauer
1个回答

7
这绝对是一个主观问题,但我将给出我的看法:)

根据我的经验,在单元级别测试处理程序并不划算。我通常会花费大量时间来创建固定装置和触发人工事件;这导致测试通过,但我对我的视图在真实世界中是否能正常运行没有多少信心(这也不太有趣)。我发现所有的时间都花在其他地方要好得多。
然而,某种程度的覆盖率是很重要的,我尝试用以下方法来实现:
1. 将处理程序中的复杂逻辑移至可以独立测试的助手函数中。理想情况下,这些函数足够“纯净”,可以在单元环境中轻松测试。如果它们难以测试,那么就放弃吧!
2. 依靠集成测试来测试与您的视图的交互。这是测试各种交互场景的最简单方法,例如“当我在文本区域中输入消息并按下回车键时,会出现新消息”,而无需头痛地人为触发交互。当然,编写Selenium测试并不是我的乐趣之选;)
3. 放松。覆盖率最好以测试的功能为衡量标准,而不是测试的方法/处理程序。如果您确信您对应用程序交互所做的假设已经“覆盖”了——无论以何种方式——那么您就完成了任务。
这并不适用于所有应用程序或团队,但在我工作的团队和应用程序中,这被证明是最有效的方法。我很想听听其他人对此问题的看法。

1
我喜欢这个答案。诚实的测试覆盖率是最好的测试覆盖率! - okcoker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接