假设我有函数foo()
:
var foo = function(string) {
return string.replace(/a/g, '');
};
我对其进行了以下测试:
foo()
存在;foo()
从字符串中去除a
并且不对没有a
的字符串做任何事情;foo()
如果给定的不是字符串,则抛出TypeError
;
问题出在测试 #3 — 然而它从一开始就是绿色的,这不是我的优点。我希望写出这样的东西:
var foo = function(string) {
if (typeof string !== 'string') {
throw new TypeError('argument should be a string');
}
return string.replace(/a/g, '');
};
但我不能,因为没有测试。所以 foo()
确实会抛出 TypeError,但不是因为参数类型错误,而是因为 null、undefined、number、array、boolean、regexp 等作为参数给出的对象不提供 replace()
方法。
我想我需要这个测试,只是因为 JS 团队可能会将这种特殊情况的 TypeError
更改为类似 MissingMethodError
的东西,但我会违反 Red > Green >重构原则。我应该如何解决这种情况?
最佳答案
这可能会发生,但最好避免它。在这种情况下,您可以通过以不同的顺序编写测试来避免这种情况。
1) foo 存在;
红色是因为 foo 不存在。写一个空的 foo();现在它是绿色的。
2) 如果参数不是字符串,foo 会抛出 TypeError。
红色是因为 foo 从不抛出 TypeError(或其他任何东西)。让 foo 无条件地抛出 TypeError;现在所有测试都是绿色的。
3) foo 去掉 a。
红色,因为它没有。现在实现;现在你所有的测试都通过了,而且所有的测试都是红色的。
这似乎是一种人为的方法,当然是,而且事先知道如何编写测试以坚持红-绿-重构并不容易。但你做的越多,它就会变得越容易。
Red-green-refactor 确实很重要,值得尝试遵循,因为如果测试一开始是绿色的,它可能没有测试任何对被测系统有意义的东西。有时,就像这个例子一样,你会碰到它;您可以调整被测系统以强制显示红色,但也可以尝试从中学习(就像您通过提出这个问题所做的那样),以便下次会更好。
关于javascript - 在 TDD 中,测试能否从一开始就是绿色的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21533746/