测试驱动开发迫使公共方法过多

Ror*_*ryG 14 tdd

从新手到TDD的一个非常具体的问题:

我将我的测试和我的应用程序分成不同的包.因此,我的大多数app方法必须公开才能访问它们.随着我的进步,很明显某些方法可能变得私有,但如果我做出改变,访问它们的测试将无法工作.我错过了一步,或做错了什么,或者这只是TDD的一次垮台?

Jos*_*osh 18

这不是TDD的垮台,而是一种测试方法,认为您需要测试每个属性和每个方法.事实上,在测试时你不应该关心私有方法,因为它们只应该存在以便于API的某些公共部分.

永远不要为了测试目的而将某些内容从私人改为公

您应该尝试仅验证公开可见的行为.其余的是实现细节,您特别希望避免测试它们.TDD旨在为您提供一组测试,使您可以轻松更改实施细节,而不会破坏测试(更改行为).

假设我有一个类型:MyClass我想测试该DoStuff方法.我所关心的是该DoStuff方法做了一些有意义的事情并返回了预期的结果.它可能会调用一百个私有方法来达到这一点,但我并不关心该方法的消费者.

  • 但你****想要一种方法来测试那些数百种内部方法,不是吗? (4认同)
  • @Ian - 如果您正在进行TDD,那么它们应该已经过测试.它们的存在意味着它们被放在那里以便进行测试.但是,这些方法是一个实现细节,该类的消费者不应该知道.如果我后来发现我可以将这100个方法重构为50个方法,我不应该重写我的测试.所以...是的,你测试它们,但不是直接因为你只关心公共API.如果有一些私有方法无法通过公共API执行,那么它是无用的,应该被删除. (4认同)

Yis*_*hai 9

您没有指定使用的语言,但在大多数语言中,您可以将测试放在具有更多特权访问权限的方式中.例如,在Java中,测试可以位于同一个包中,实际的类文件位于不同的目录中,因此它与生产代码分开.

但是,当你进行真正的TDD时,测试正在推动类设计,所以如果你有一个方法只是为了测试一些功能的子集,你可能(并不总是)做错了,你应该看看技术喜欢依赖注入和模拟以更好地指导您的设计.

  • 我在C#中遇到了类似的问题 - 在那个语言/框架中,你需要`InternalsVisibleTo`指令. (3认同)

Car*_*ter 7

这就是古老的说法,"TDD与设计有关",经常出现.一个拥有太多公共方法的课程可能有太多的责任 - 而且你试驾它的事实只会暴露出来; 它不会导致问题.

当你发现自己处于这种情况时,最好的解决方案是经常找到可以提取到新类("sprout类")的公共方法的一些子集,然后给你的原始类提供一个sprouted类的实例变量.公共方法值得在新类中公开,但它们现在 - 就原始类的API而言 - 私有.而且你现在更好地坚持SRP,更松散的耦合,更低的凝聚力 - 更好的设计.

所有这些都是因为TDD暴露了你班级的特征,否则这些特征会在雷达下滑动. TDD是关于设计的.