许多开发人员认为测试私有方法是一个坏主意。然而,我发现的所有例子都基于私有方法是私有的想法,因为调用它们可能会破坏内部对象的状态。但这不仅是隐藏方法的理由。单元测试私有方法:门面模式
让我们考虑Facade模式。我的班级用户需要2种公共方法。他们会太大。在我的例子中,他们需要从数据库的BLOB中加载一些复杂的结构,解析它,填充一些临时COM对象,运行用户宏来验证和修改这些对象,并将修改后的对象序列化为XML。单个metod的相当大的功能:-)这两个公共方法都需要这些操作。所以,我创建了大约10个私有方法,并且有2个公有方法调用它们。其实,我的私人方法不一定是私人的,他们不会破坏实例的内部状态。但是,当我不惯于测试私有方法,我有以下问题:
- 发布它们意味着用户的复杂性(他们有他们不需要选择)
- 我无法想象TDD风格对于这样一个大型的公共方法,当你要编写500多行代码只是为了返回一些东西(甚至不是真正的结果)。
- 从数据库中检索这些方法的数据,并且测试数据库相关的功能要困难得多。
当我测试的私有方法:
- 我不发表会混淆用户的详细信息。公共接口包括2种方法。
- 我可以工作在TDD风格(一步一步写小方法)。
- 我可以使用测试数据覆盖大部分类的功能,无需连接数据库。
可能有人形容,我究竟做错了什么?我应该使用什么样的设计来获得相同的奖金,而不要测试私人方法?
更新:在我看来,我已经提取了一切,我能够到另一个类。所以,我无法想象我可以提取什么。从数据库加载由ORM层执行,解析流,序列化为XML,运行宏 - 一切都由独立类完成。这个类包含相当复杂的数据结构,搜索和转换的例程,并且需要所有提到的实用程序。所以,我认为别的东西是不能提取的;否则,它的责任(关于数据结构的知识)将在类之间分配。
所以,最好的方法来解决我看到现在分成两个对象(门面本身和实物,与私有方法成为大众)和移动真实物体的某个地方,没有人会尝试找到它。在我的情况下(Delphi)它将是一个独立的单元,在其他语言中它可能是一个单独的名称空间。其他类似的选项是2接口,感谢您的想法。
它看起来像已经有一个相同的问题,这一个:http://stackoverflow.com/questions/250692/how-do-you- unit-test-private-methods – 2009-01-08 20:22:28
不是它的笨蛋 – krosenvold 2009-01-08 20:39:17