javascript - 在 TDD 中,测试能否从一开始就是绿色的?

标签 javascript unit-testing testing tdd methodology

假设我有函数foo():

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

我对其进行了以下测试:

  1. foo() 存在;
  2. foo() 从字符串中去除 a 并且不对没有 a 的字符串做任何事情;
  3. 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/

相关文章:

javascript - 过滤对象数组的性能

selenium - Web 驱动程序在检查元素的不可见性时不等待指定的时间限制

java - 在 JUnit 测试期间禁用部分 Java 程序

javascript - SlickGrid 并从单元格复制文本

javascript - 在 JQuery 中的动态数组中创建动态数组

java - Java 中类似 Python 的文档测试?

java - @SpringBootTest 测试类是否正确?

java - 测试私有(private)方法时不加载配置值

ruby-on-rails - 如何测试需要用户登录的操作?

PHP http_build_url() 和 PECL 安装