tor*_*gen 0 javascript testing tdd methodology unit-testing
想象一下我有功能foo():
var foo = function(string) {
return string.replace(/a/g, '');
};
Run Code Online (Sandbox Code Playgroud)
我有以下测试工作:
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, '');
};
Run Code Online (Sandbox Code Playgroud)
但我不能,因为没有测试.所以foo()真的抛出TypeError,但不是因为错误类型的参数,而是因为null,undefined,number,array,boolean,regexp等作为参数给出的对象不提供replace()方法.
我想我需要这个测试,只是因为JS团队可能会TypeError将此特定情况更改为类似的情况MissingMethodError,但我会违反Red> Green> Refactor原则.我该如何解决这种情况?
这可能发生,但最好避免它.在这种情况下,您可以通过以不同的顺序编写测试来避免它.
1)foo存在;
红色,因为当然foo不存在.写一个空的foo(); 现在它是绿色的.
2)如果参数不是字符串,foo会抛出TypeError.
红色因为foo从不抛出TypeError(或其他任何东西).让foo无条件地抛出TypeError; 现在所有测试都是绿色的.
3)foo剥掉了a.
红色,因为它没有.现在实施; 现在所有的测试都通过了,所有测试都开始变红了.
这似乎是一种人为的方法,当然也是如此,事先知道如何编写测试以坚持红绿重构并不容易.但是你做的越多,就越容易.
红绿重构确实很重要,值得尝试遵循,因为如果测试开始是绿色的,它可能不会测试有关被测系统的任何有意义的东西.有时,就像在这个例子中,你碰到它; 您可以调整被测系统以强制红色,但也尝试从中学习(正如您通过提出这个问题所做的那样),以便下次更好.
| 归档时间: |
|
| 查看次数: |
70 次 |
| 最近记录: |