想象一下,我有函数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()
方法。 / p>
我认为我需要这个测试,因为JS团队可能会将此特定案例的TypeError
更改为MissingMethodError
,但我会违反Red>绿色>重构原则。我该如何解决这种情况?
答案 0 :(得分:6)
这可能发生,但最好避免它。在这种情况下,您可以通过以不同的顺序编写测试来避免它。
1)foo存在;
红色,因为当然foo不存在。写一个空的foo();现在它是绿色的。
2)如果参数不是字符串,则foo抛出TypeError。
红色因为foo从不抛出TypeError(或其他任何东西)。让foo无条件地抛出TypeError;现在所有测试都是绿色的。
3)foo剥掉了a。
红色,因为它没有。现在实施;现在你所有的测试都通过了,所有的测试都是红色的。
这似乎是一种人为的方法,当然也是如此,并且事先知道如何编写测试以坚持红绿重构并不容易。但是你做的越多,它就越容易。
红绿重构真的非常重要,值得一试,因为如果测试开始是绿色的,那么它可能无法测试任何有关被测系统的意义。有时,就像在这个例子中,你碰到它;你可以调整被测系统以强制红色,但也尝试从中学习(正如你通过提出这个问题所做的那样)所以下次会更好。
答案 1 :(得分:0)
您可能会测试您的TypeError是否有正确的消息。目前,它可能不是你所期望的。
最后,您应该问自己是否值得拥有自定义错误类型。使用功能时更容易进行测试并更容易操作。