javascript - 能否在 TDD 方法中淘汰和删除冗余测试?

标签 javascript unit-testing testing tdd methodology

我有两个函数,foobar

function foo() {
    if (arguments.length !== 1) {
        throw new TypeError('only one argument expected');
    }

    do work;
}

function bar() {
    if (arguments.length !== 3) {
        throw new TypeError('exactly three arguments expected');
    }

    do work;
}

这些函数是根据 TDD 创建的——例如首先编写测试,然后实现功能以使测试通过。测试列表:

  1. foo() 已定义
  2. foo() 做正确的事
  3. foo() 当参数数量错误时抛出 TypeError
  4. bar() 定义
  5. bar() 做对了
  6. bar() 当参数数量错误时抛出 TypeError

如您所见,这些函数都具有复制功能——它们各自测试参数的正确性。由于此检查在我的函数中将非常常见,并且可能会变得更加复杂(检查参数计数是否在某个范围内,检查参数类型等),我决定将其移出到单独的装饰器函数中 检查

所以我为 check 编写了测试并实现了 check 本身。

现在是重构步骤 — 我利用了 check,所以函数现在看起来如下:

foo = check(1, function() {
    do work;
});

bar = check(3, function() {
    do work;
});

我现在应该做什么来检查 foo()bar() 接受正确数量的参数的测试?我可以放下它们吗?

当我实现函数 buzz() 时,它会立即使用 check()(因为它现在用作定义函数的方式),我是否必须编写测试它是否接受正确数量的参数?我在犹豫,因为这个测试总是绿色的,因为所有的工作都是在装饰器中完成的,所以还有测试的必要吗?

最佳答案

我会避免保留检查相同代码的多个单元测试,因为将来:

  1. 如果您故意以破坏测试的方式更改 check 函数,则必须更改 2 个测试而不是一个。
  2. 如果你无意中破坏了check,你会得到两个错误:一个引用foo,一个引用bar,并且它损坏的是 check 功能并不明显。

所以,我会只保留一组测试,明确命名为 check 函数的测试,更好的是,不要使用程序的函数来测试它们(不是 foo 在您的示例中既不是 bar ),而是使用仅用于测试目的的假函数。

通过这种方式,您可以在将来更改 foobar 以使用,例如,一个 check2 函数,而无需对 check 函数进行中断测试

根据我的说法,这是最好的理论方法,但要务实:如果你不希望在一个很好的情况下使用 check 函数,请不要尝试遵循这种方式您的代码的一部分:您的目标必须让主程序顺利运行,而不是一组漂亮的测试......

关于javascript - 能否在 TDD 方法中淘汰和删除冗余测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21501331/

相关文章:

javascript - 带有 li & ul 的多级下拉列表,带有 PHP 数组循环,带有 CSS 和 jQuery

haskell - 在 Haskell 中隐式注册单元测试

node.js - 诗农用 Sequelize 进行 mock

unit-testing - 我如何在Dart中的then语句中进行测试

unit-testing - 学习 Node 单元

testing - 错误 : <spyOn> : fetch() method does not exist in PhantomJS

ruby-on-rails - 如何在 Rails 应用程序中测试 PG::QueryCanceled(由于超时)错误?

javascript - 单击时出现 div 时保持元素不移动

javascript - 如何在位置 : n in div 插入新元素

javascript - 在组件中加载初始数据时,如何在 react-transition-group 中暂停动画?