1

真正吸引我关注 TDD 的一件事是在实现的同时清晰地开发规范。

我正在寻求实现一个接受配置对象的构造函数

function MyConstructor(conf) {}

conf目前指定有两个键:aand b, where ais aRegExpbis a Function, 作为我的 TDD 规范说明野心的一部分,我正在编写测试来指定这个对象:

  • 我想MyConstructor抛出一个Errorifa不是 aRegExpb不是 a Function
  • MyConstructor抛出一个Errorifab配置中缺少。

现在,我知道我可以将此行为封装在其他构造函数中,比如Configuration创建“配置”对象的构造函数。但是我现在看到的方式,无论这种行为最终在哪里结束,这种行为都必须封装在某个地方,以便通过 TDD 详细说明这个规范。

问题是:在我看来,随着conf对象上键的数量增加,测试的数量也在增加——呈指数增长!这尤其是由于上面的第二个项目符号。

例如,假设我有 4 个键:a、和,并且我需要确保如果缺少任何键,则会引发错误b似乎这需要我编写大量相同的、平庸的测试来涵盖丢失键的所有可能性(组合!)。这听起来不对!然而,我想不出一种明确或归纳测试涵盖所有场景的好方法。有什么想法吗?cd

4

2 回答 2

1

我建议您使用Duck Typing来强制执行类型。从本质上讲,您要做的就是按照您的预期使用通过您的键传入的对象,并让 JS 运行时抱怨,例如,a如果行为不像 RegEx 或者您不能b像函数一样调用.

于 2013-08-08T16:09:20.330 回答
1

没有类定义或接口的对象很难测试。如果你的对象是鸭子,你需要使用鸭子打字来检查。

您还可能想知道完全测试某些功能有多大用处。您可以测试边界,但永远无法测试所有值;

如果您的函数如下所示:

function sum(a, b) {
    if (a === 42) {
        throw new Error("All glory to the hypnotoad");
    }
    return a + b;
}

您希望如何找到此错误

于 2013-08-08T16:05:49.973 回答