我有两个函数,foo
和 bar
。
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 创建的——例如首先编写测试,然后实现功能以使测试通过。测试列表:
foo()
已定义foo()
做正确的事foo()
当参数数量错误时抛出TypeError
bar()
定义bar()
做对了bar()
当参数数量错误时抛出TypeError
如您所见,这些函数都具有复制功能——它们各自测试参数的正确性。由于此检查在我的函数中将非常常见,并且可能会变得更加复杂(检查参数计数是否在某个范围内,检查参数类型等),我决定将其移出到单独的装饰器函数中 检查
。
所以我为 check
编写了测试并实现了 check
本身。
现在是重构步骤 — 我利用了 check
,所以函数现在看起来如下:
foo = check(1, function() {
do work;
});
bar = check(3, function() {
do work;
});
我现在应该做什么来检查 foo()
和 bar()
接受正确数量的参数的测试?我可以放下它们吗?
当我实现函数 buzz()
时,它会立即使用 check()
(因为它现在用作定义函数的方式),我是否必须编写测试它是否接受正确数量的参数?我在犹豫,因为这个测试总是绿色的,因为所有的工作都是在装饰器中完成的,所以还有测试的必要吗?
最佳答案
我会避免保留检查相同代码的多个单元测试,因为将来:
- 如果您故意以破坏测试的方式更改
check
函数,则必须更改 2 个测试而不是一个。 - 如果你无意中破坏了
check
,你会得到两个错误:一个引用foo
,一个引用bar
,并且它损坏的是check
功能并不明显。
所以,我会只保留一组测试,明确命名为 check
函数的测试,更好的是,不要使用程序的函数来测试它们(不是 foo
在您的示例中既不是 bar
),而是使用仅用于测试目的的假函数。
通过这种方式,您可以在将来更改 foo
或 bar
以使用,例如,一个 check2 函数,而无需对 check 函数进行中断测试
根据我的说法,这是最好的理论方法,但要务实:如果你不希望在一个很好的情况下使用 check
函数,请不要尝试遵循这种方式您的代码的一部分:您的目标必须让主程序顺利运行,而不是一组漂亮的测试......
关于javascript - 能否在 TDD 方法中淘汰和删除冗余测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21501331/