
[英]The .replaceWholeText() method is obsoleted, what other methods can do this?
[英]Can redundant tests be obsoleted and dropped in TDD methodology?
我有两个函数, 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
。
现在重构步骤 - 我已经利用了check
,所以函数现在看起来如下:
foo = check(1, function() {
do work;
});
bar = check(3, function() {
do work;
});
我现在应该怎么做检查foo()
和bar()
采用正确数量的参数? 我可以放下它们吗?
当我实现函数buzz()
,它立即使用check()
(因为它现在用作定义函数的方式),我是否必须为它编写测试以获取正确数量的参数? 我犹豫了,因为这个测试总是绿色的,因为所有的工作都是在装饰器里完成的,所以有没有需要测试?
我会避免保留多个检查相同代码的单元测试,因为将来:
check
功能,则必须更改2个测试而不是1个。 check
,你将会遇到两个失败:一个是foo
而另一个是指bar
,而且看不出来的是check
功能。 所以,我将只保留一个组测试中,明确指定为测试check
功能,甚至更好,不要用你的程序的功能,以测试它们(不foo
既不是bar
在你的例子),但使用使用假的功能仅用于测试目的。
通过这种方式,您可以在将来改变foo
或bar
来使用,例如check2函数,而不需要检查函数的中断测试
根据我的说法,这是最好的理论方法,但要务实:如果你不希望在代码的很大一部分中使用check
功能,请不要尝试这样做:你的目标必须有主程序运行顺畅,没有一套漂亮的测试......
经典的TDD概念需要一些额外的修改才能将它们应用于动态语言,如Javascript(由于缺少类,特定的闭包使用......)这就是我们拥有像Jasminejs这样的测试库的方式。 我不能明确告诉你如何处理你的功能,但我知道一切都不需要测试。 有些事情真的很明显,他们只需要一些理智检查。 经验法则是测试可能破坏的东西。 例如验证,数据库访问,用户输入......
我认为你是在正确的道路上,TDD使代码重复变得更加明显(检查参数代码必须在有或没有TDD的情况下删除它的重复)并且你听你的测试并分开检查的责任,现在你有两个责任:
在单元测试级别,这是完美的,我认为,或许在其他方面,您需要一些集成或系统测试来检查您是否正确地使用他的检查器编写功能。
如果有单独的声明,则需要进行测试。 因此,在您的情况下,您需要保持要求foo()
和bar()
使用check
函数的测试。 这些测试可能比您编写的原始测试更简单:例如,他们可能只检查是否抛出了错误,而没有查看错误消息。
如果检查功能现在被打破,例如什么都不做,那么会有多个检测器检测到这一点。 这不是问题,因为你会将check
功能的测试置于顶部,因此第一次失败将直接指向根本原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.