【发布时间】:2013-08-08 16:02:46
【问题描述】:
真正吸引我关注 TDD 的一件事是在实现的同时清晰地开发规范。
我正在寻求实现一个接受配置对象的构造函数
function MyConstructor(conf) {}
conf 目前指定有两个键:a 和 b,其中 a 是 RegExp 和 b 是 Function,并且作为我的 TDD 规范的一部分阐明野心,我正在编写测试来指定这个对象:
- 如果
a不是RegExp或b不是Function,我希望MyConstructor抛出Error。 -
如果配置中缺少
a或b,MyConstructor将抛出Error。
现在,我知道我可以将此行为封装在其他构造函数中,比如创建“配置”对象的Configuration 构造函数。但是我现在看到的方式,无论这种行为在哪里结束,这种行为都必须封装在某处,以便通过 TDD 详细说明这个规范。
问题是:在我看来,随着conf 对象上的键数量的增加,测试的数量也在增加——呈指数增长!这尤其是由于上面的第二个项目符号。
例如,假设我有 4 个键:a、b、c 和 d,我需要确保如果缺少任何键,则会引发错误。 似乎这需要我编写大量相同的、平庸的测试来涵盖丢失键的所有可能性(组合!)。这听起来不对!然而,我想不出一种明确或归纳测试涵盖所有场景的好方法。有什么想法吗?
【问题讨论】:
-
我对这个问题有点困惑。规范会指出,如果 ctor 缺少任意数量的任意数量的键中的任何一个,它将失败。您不必测试所有组合(无论如何您都可以通过编程方式进行),您只需确保是否缺少任何必需的键就会抛出。听起来像是简单的对象验证,其中存在预先构建的解决方案。
-
@DaveNewton,所以在我有限的单元测试经验中,我从未见过用循环或嵌套循环编写,迭代组合。您是说鉴于测试必须(a)快速(b)简单,这是一件好事吗? (不确定最后一个,但这是我的印象)。
-
以有意义的方式以编程方式创建排列比手动编写相同的测试要慢吗?如果您实际上需要测试所有排列,它们也更有可能随着时间的推移变得更正确......如果我们只是谈论需要确保所有必需的参数都存在。
-
@DaveNewton,你是完全正确的,但我应该首先编写这些循环吗?我会 完全喜欢通过测试来说明我的规范的每一个细节,但我也不想对 JavaScript 做不应该对 JavaScript 做的思考。你怎么看?
-
我没有看到以编程方式生成测试数据的问题。我什至以编程方式生成测试和规范,虽然不是在 JavaScript 中。
标签: javascript unit-testing testing