【问题标题】:How do I write a test for a function that should do nothing?如何为不应该执行任何操作的函数编写测试?
【发布时间】:2018-01-09 22:29:43
【问题描述】:

有时,我编写的函数在某些情况下应该什么都不做。他们不做任何事情不仅是可以接受的,而且实际上是必需的行为。是否有测试函数以确保其没有副作用的模式?


例如,我目前正在测试一个如下所示的函数:

function onRowOfIconsClicked(iconName) {
  if (iconName === 'new') {
    doSomeAwesomeStuffImAlreadyTesting();
  }
  // We haven't implemented the other icons yet, so for now,
  // do nothing and don't throw an error if a different icon
  // is clicked
}

我将如何编写一个测试用例来断言当onRowOfIconsClickediconName 而不是"new" 调用时,该函数什么都不做?

【问题讨论】:

  • 我可以编写一个测试来确保该函数通常会导致的特定副作用不会发生。如果这是这样的测试的唯一模式,那就是我要做的。不过,我想知道是否有我不知道的更优雅或更常用的模式。
  • 这些函数有多复杂?您能否为onRowOfIconsClicked()doSomeAwesomeStuffImAlreadyTesting() 创建一个间谍,如果iconName != 'new' 那么第一个间谍应该被调用一次,而第二个则根本不调用。假设上面的代码是它的实际结构。
  • 我猜你可以在 else 块中设置函数 arguments.callee.did_nothing = 1,如果它什么都不做的话......
  • 问问自己为什么需要测试那个特殊情况。是否有更好的方法来构建不需要无操作的代码?如果你以后想做点什么,你想让自己以后更难吗?

标签: javascript testing mocha.js


【解决方案1】:

所有 JavaScript 函数都有一个返回值,即使该返回值是 undefined,因为没有明确的 return 语句用于指定返回值。

然后您可以做的是测试是否使用iconName 参数而不是'new' 调用该函数,然后测试该函数是否返回undefined。因为undefined === undefined等会通过测试。

【讨论】:

  • 感谢您的建议!不幸的是,这似乎并不能确保该函数没有任何副作用,这是我要保证的。
  • 那么这里起作用的是考虑编写没有副作用的“纯”函数,更容易测试。然而,并不总是可以避免的。在给定特定输入的情况下,围绕测试函数的特定行为而设计单元测试时效果最佳。所以在这种情况下,编写一个单元测试来确保如果没有传入'new',则返回undefined。只是要记住的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多