如何在BDD/TDD中对私有方法进行单元测试?

17

我正在尝试按照行为驱动开发的方式编程,该方法规定在编写任何代码前必须先编写失败的单元测试。

我的问题如下:

  • 如何在私有方法中使用BDD?
  • 如何对私有方法进行单元测试?

是否有比以下两种方法更好的解决方案:

  • 首先将私有方法公开,然后在编写使用这些私有方法的公共方法时再将它们设为私有;
    或者
  • 在C#中将所有私有方法设置为internal并使用InternalsVisibleTo属性。


3
请参考以下两个链接,了解如何对私有方法进行单元测试:https://dev59.com/bHVD5IYBdhLWcg3wRpaX 和 https://dev59.com/9HVD5IYBdhLWcg3wDXF3。这些回答提供了一些有见地的建议。 - David Johnstone
请忽略问题#1中得票最高的答案,或者直接跳到David发布的第二个答案。为您的团队着想;仅在万不得已时使用反射(以及其他聪明的方法来获取设计师不希望暴露的内容)。更喜欢简单的方式。 - Gishu
12个回答

0

如果你发现自己想要测试一个私有方法,那么它可能存在一些复杂性,你想要测试它是正确的,这是一种设计上的问题。将该方法暴露在接口上只会换来另一种更糟糕的问题。

是时候进行重构了 :)

通常我会将内部复杂性分解到一个辅助类中。但是请检查该方法是否存在“特征嫉妒”或“不当亲密关系”。可能有更好的位置适合该方法存在。现在,在 .net 中使用扩展方法,甚至基本类型也可以成为一个好的选择。

祝你好运


0
如果你真的认为一个私有方法足够复杂,需要单独编写单元测试,那么这表明你的类做了太多的事情,应该将部分或全部私有方法提取到一个新的类中,并在接口后面进行封装。
在测试原始类时,模拟接口。现在,您应该有一个公共访问器来访问之前是私有方法的新类。
有时,在处理旧代码时,可能需要测试私有类,这些代码可能编写不当或未使用TDD编写。在这种情况下,您应该使用反射,但在可能的情况下,更新代码以更接近TDD的方式编写。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接