c# - 同一类的单元测试(有条件编译)?

标签 c# .net unit-testing

我知道(并同意)将单元测试放在单独的程序集中的常见论点。但是,最近我遇到了一些我真的很想测试私有(private)方法的情况。所讨论的幕后逻辑非常复杂,以至于测试公共(public)和内部接口(interface)并不能完全完成工作。针对类的公共(public)接口(interface)的测试让人感觉过于紧张,而且我看到了几个地方,在这些地方对私有(private)接口(interface)进行一些测试可以更简单有效地完成工作。

在过去,我通过将我需要测试的东西设为 protected 并创建一个我可以用来在测试框架中获取它的子类来解决这些情况。但这对应该密封 的类来说效果不是很好。更不用说用所有这些脚手架使测试框架膨胀。

所以我正在考虑这样做:在类中放置一些测试,它们可以访问私有(private)成员。但是使用“#if DEBUG”将它们排除在生产代码之外。

这看起来是个好主意吗?

最佳答案

在任何人问之前...

解决方案 OP 的问题是将 IoC 与 DI 正确结合,并完全消除测试私有(private)方法的需要(如 Joel Martinez noted )。如前所述multiple times ,对私有(private)成员进行单元测试不是可行的方法

但是,有时您不能更改代码(遗留系统,破坏性更改的风险 - 随您便),也不能使用允许私有(private)成员的工具测试(如 Typemock,它是付费产品)。对于这种情况,您可以根本不测试,或者偷工减料。我认为这是 OP 面临的情况。


私有(private)方法测试讨论放在一边...

请记住,您可以使用反射 来访问和调用私有(private)成员。

在我看来,将条件调试放在类本身是一个相当糟糕的主意——它给类代码添加了噪音(例如,不相关的东西)。当然,它会在发布时消失,但您(可能还有其他程序员)将不得不在日常基础上处理它。

我意识到您的想法在纸面上听起来不错 - 包含条件调试的简单测试。但实际上,测试很快就会使用额外变量(这些也必须放在类代码中)、一些实用程序(额外引用、自定义类型), 测试框架(甚至更多引用资料)等等。这一切都必须以某种方式连接到类代码。将所有这些放在一起,您很快就会得到一个无法维护的怪物

您确定要处理吗?特别是考虑到将简单的基于反射的实用程序放在一起可能并不难。

关于c# - 同一类的单元测试(有条件编译)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11036389/

相关文章:

c# - ToArray() 方法将所有实例克隆为最后一个

.net - 重定向程序集绑定(bind)是否适用于使用测试运行程序进行单元测试?

c# - 如何通过更改文本来更改组合框中的下拉项?

C# 解析文本 block

c# - 查找第一个大写字符的索引

c# - SQLite 数据库连接有哪些附加配置信息?

c# - 实现一个抽象方法,它本身是通用接口(interface)方法的实现

C# 3 个新功能帖子(与 .Net 3.5 功能无关)

angularjs - Promise.catch() 不会在 AngularJS 单元测试中捕获异常

python - 模拟 Celery 任务方法 apply_async