可以从TDD一开始就测试绿色吗?

时间:2014-02-03 17:31:25

标签: javascript unit-testing testing tdd methodology

想象一下,我有函数foo()

var foo = function(string) {
    return string.replace(/a/g, '');
};

我有以下测试工作:

  1. foo()存在;
  2. foo()从字符串中删除a,并且在没有a的情况下不执行任何操作;
  3. 如果给出的不是字符串,
  4. foo()会抛出TypeError;
  5. 问题在于测试#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>绿色>重构原则。我该如何解决这种情况?

2 个答案:

答案 0 :(得分:6)

这可能发生,但最好避免它。在这种情况下,您可以通过以不同的顺序编写测试来避免它。

1)foo存在;

红色,因为当然foo不存在。写一个空的foo();现在它是绿色的。

2)如果参数不是字符串,则foo抛出TypeError。

红色因为foo从不抛出TypeError(或其他任何东西)。让foo无条件地抛出TypeError;现在所有测试都是绿色的。

3)foo剥掉了a。

红色,因为它没有。现在实施;现在你所有的测试都通过了,所有的测试都是红色的。

这似乎是一种人为的方法,当然也是如此,并且事先知道如何编写测试以坚持红绿重构并不容易。但是你做的越多,它就越容易。

红绿重构真的非常重要,值得一试,因为如果测试开始是绿色的,那么它可能无法测试任何有关被测系统的意义。有时,就像在这个例子中,你碰到它;你可以调整被测系统以强制红色,但也尝试从中学习(正如你通过提出这个问题所做的那样)所以下次会更好。

答案 1 :(得分:0)

您可能会测试您的TypeError是否有正确的消息。目前,它可能不是你所期望的。

最后,您应该问自己是否值得拥有自定义错误类型。使用功能时更容易进行测试并更容易操作。