优先于接口测试而不是实现测试。
据我了解,私有方法不可测试
这取决于您的开发环境,请参见下文。
[私有方法]不必担心,因为公共API将提供足够的信息来验证对象的完整性。
没错,TDD专注于测试接口。
私有方法是一种实现细节,可以在任何重构周期内更改。应该可以在不更改界面或黑匣子行为的情况下进行重构。实际上,这是TDD好处的一部分,您可以轻松地产生信心,即班级内部的更改不会影响该班级的用户。
好吧,对于我来说,可以创建一个仅具有私有方法并通过侦听其他事件与其他对象进行交互的对象。这将被非常封装,但是完全不可测试。
即使类没有公共方法,它的事件处理程序是它的公共接口,而且其针对的是 公共接口,你可以测试一下。
由于事件是接口,因此它是您需要生成以测试该对象的事件。
研究将模拟对象用作测试系统的粘合剂。应该可以创建一个简单的模拟对象,该对象生成一个事件并获取状态的变化(可能由另一个接收者模拟对象)。
另外,为了测试而添加方法也被认为是不好的做法。
绝对,您应该非常警惕暴露内部状态。
这是否意味着TDD与封装不一致?适当的余额是多少?
绝对不。
TDD除了可能简化类的实现之外,不应更改类的实现(通过从较早的位置应用YAGNI)。
使用TDD的最佳实践与不使用TDD的最佳实践是相同的,您只需找出原因,便会更快,因为在开发界面时就使用了该界面。
我现在倾向于公开大多数或所有方法...
这宁可将婴儿与洗澡水一起扔出去。
您无需公开所有方法,即可以TDD方式进行开发。请参阅下面的注释,看看您的私有方法是否真的不可测试。
更详细地介绍测试私有方法
如果您绝对必须对类的某些私人行为进行单元测试,具体取决于语言/环境,则可以有以下三种选择:
- 将测试放在要测试的类中。
- 将测试放在另一个类/源文件中,并将要测试的私有方法公开为公共方法。
- 使用一个测试环境,该环境允许您将测试代码和生产代码分开,但仍允许测试代码访问生产代码的私有方法。
显然,第三个选项是迄今为止最好的。
1)将测试放在您要测试的课程中(不理想)
最简单的选择是将测试用例与要测试的生产代码存储在相同的类/源文件中。但是,如果没有很多预处理器指令或注释,最终将导致测试代码不必要地膨胀生产代码,并且取决于您如何构造代码,最终可能会意外地向代码用户公开内部实现。
2)将要测试的私有方法公开为公共方法(真的不是一个好主意)
如建议的那样,这是非常差的做法,会破坏封装并将内部实现向代码用户公开。
3)使用更好的测试环境(最佳选择,如果有的话)
在Eclipse世界中,3.可以通过使用fragments实现。在C#世界中,我们可以使用局部类。其他语言/环境通常具有类似的功能,您只需要找到它即可。
盲目假设1.或2.是唯一的选择,可能会导致生产软件software满测试代码或讨厌的类接口,从而在公共场合清洗脏的亚麻布。* 8')