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

rob*_*t_d 15 tdd bdd unit-testing

我正在尝试根据行为驱动开发进行编程,该开发表明,如果不首先编写失败的单元测试,则不应编写任何代码行.

我的问题是,如何将BDD与私有方法一起使用?
我如何对私有方法进行单元测试?
有没有更好的解决方案:
- 首先将私有方法公开,然后在编写使用这些私有方法的公共方法时将其设为私有;
或者
- 在C#中使所有私有方法都在内部并使用InternalsVisibleTo属性.

Ste*_*ham 22

当您首先编写代码时,您将针对公共接口进行编写.此时没有私人方法.

然后你编写代码来通过测试.如果将任何代码纳入私有方法中,那么这并不重要 - 它应该仍然存在,只是因为公共接口使用它.

如果代码不是先编写测试,那么 - 在.net中,无论如何 - 反射可以用来直接激活私有方法; 虽然这是一种万不得已的技术.


jri*_*sta 11

私有方法是内部实现细节.它们不应该直接测试,因为它们将通过测试您的公共接口间接测试.如果由于某种原因在完全测试公共接口时未涵盖私有方法,则不需要私有方法,应将其删除.

通常,将测试代码绑定到私有实现细节是个坏主意.这会将您的测试与那些私密细节相结合,从而降低您随意更改这些细节的自由,即使它们不会影响面向公众的界面和行为.这增加了编写和维护单元测试所需的工作量,这是一个负面的事情.您应该争取尽可能多的覆盖,同时只绑定到公共接口.


eKe*_*ek0 9

简短回答:你不测试私有方法.

如果编程良好,测试的代码覆盖率应该隐式地测试私有方法.


Gle*_*len 7

如果存在私有方法方法,则由公共方法使用.因此,我会为公共方法编写一个测试.

我编写测试来测试类的公共部分.如果该类设计得很好,那么默认情况下会对私有部件进行测试.

如果没有从公共方法调用私有方法,那么为什么它存在?

在你的情况下,我会做以下事情

* Write failing test for the public method
* Write public method that calls the private method that doesn't exist yet(test still fails as your class is incomplete
* Write the private method
* Test should now pass
Run Code Online (Sandbox Code Playgroud)


Spo*_*ike 7

简短回答:您无法测试私有方法.

答案很长:你不能测试私有方法,但是如果你倾向于测试它做什么,请考虑重构代码.有两种简单的方法:

  • 测试访问私有方法的公共方法.
  • 将私有代码解压缩到自己的类,即移动实现,使其适当公开.

第一个是简单的,但是当你编写更多的测试时,它倾向于让你自己拍脚,后者可以促进更好的代码和测试设计.

答案:好的,所以我撒了谎.您可以借助一些反射魔法测试私有方法(一些TDD工具支持测试私有方法).根据我的经验,它会导致复杂的单元测试.卷积单元测试会导致代码更糟糕.更糟糕的代码导致愤怒.愤怒导致仇恨.仇恨导致痛苦 ......

生产代码变得更糟的直接影响是,被测试的类往往变得庞大并处理许多事情(违反单一责任原则)并且难以维护.这违背了TDD的目的,即使生产代码可测试,可扩展,更重要的是:可重用.

如果您正在为部署的类编写测试,则可以调查调用私有方法的所有内容并相应地编写测试.如果你有机会重写课程,那么请通过拆分课程来重构它.如果你很幸运,那么你最终会得到一些你可以利用的代码重用.