为什么单元测试属性通常需要公共方法?


12

我最近注意到,不尊重在.NET程序集中的受保护方法中添加[TestInitialize],但是如果我将该方法公开,则它会被单元测试运行程序(在这种情况下为Resharper)调用。我过去用测试方法已经注意到了这几次。

从技术上讲,它就像公开方法一样容易反映在私有方法上。实际上,反射是一种用于对私有方法进行单元测试的方法。

那么,为什么我需要公开我所有的单元测试方法?


2
这是一个非常好的问题。我听到的唯一一个很好的论据是它遵循SOLID原理的“对接口编程,而不是对实现编程”原则。
罗伯特·哈维

9
我认为他不是在谈论测试他的类,而是在谈论由测试框架调用的实际测试方法。
jtiger 2015年

1
@RobertHarvey在Java中,类似限制的原因(例如在JUnit中)是因为框架设计人员不想弄乱setAccessible那些可以被某些自定义SecurityManager阻止的问题
t

1
您需要考虑到此设计决策是针对针对广泛使用的通用框架而做出的。在这种情况下,让设计师承担并做好最坏的准备就更安全了。我不知道,如果是某个公司内部框架(可以有机会保证所需的安全策略),或者如果它是狭义的,专门用途的工具(请考虑“无法访问的成员的查看器”),设计师会考虑其他选择
gna

2
@GregBurghardt在Nunit和Microsoft未编写的其他测试框架中都发现了此行为。在问了这个问题之后的几年里,我当然对.NET有了更多的了解,但是我仍然认为这是一个公平的问题,并且在注释中进行了一些很好的讨论。
贾斯汀·迪林

Answers:


2

您应该测试类的什么,不是怎么它做它。

就“外部世界”而言,这是该课程公开发布的所有内容;您的测试框架所做的假设相同。

通过测试任何比Public更“少”的东西,您正在研究类的内部实现,这是一个坏主意。


请注意,问题与测试方法有关,而不是与被测系统中的方法有关。OP确实辩称您可以使用反射来测试事物而不是公共事物,但这是关于测试框架访问私有方法的能力的争论。测试框架必须使用反射来找到测试方法(用属性标记),因此必须使用反射,并牢记……“为什么我需要公开所有单元测试方法?”
Theraot

测试方法具有访问私有方法的能力;借助反射,一切皆有可能。我对这个问题的更多了解是[不希望这样做]。
Phill W.

0

通常,最好只访问公共方法-创建类时,还要创建关于其他类应访问代码的协定。因此,答案很可能仅仅是因为这是一个惯例。


1
这并不能真正回答问题。
RubberDuck
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.