C#:在密封类中模拟和测试受保护(或私有)方法 - 方法

Tim*_*ass 5 c# unit-testing protected sealed

我有一个带有受保护方法的密封类,我想测试它的行为.这使得很难直接测试,很难模拟.

它位于不是以TDD方式开发的代码库中,我现在正在为特定功能添加单元测试.

在这种情况下可能的一般方法是什么?目前我有:

  1. 让课程开封.然后在我们的测试代码中创建从类派生的代理或适配器,以便对受保护方法进行隧道访问.
  2. 将受保护方法中的行为分解为委托/仿函数,然后重新注入它.然后独立测试分解出的行为.
  3. 通过调用使用受保护方法的继承层次结构中最近的公共方法进行测试.潜在地导致大量的嘲弄,并且当测试之外的代码发生变化时会面临风险 - 创建脆弱的测试.
  4. 使用反射来访问受保护的方法.然后直接调用它.

还有吗?

jas*_*son 8

protected在密封类方法是有效的一样private(我想如果你密封派生类,其中基类具有protected构件这些可以想出自然.)

并且没有必要测试private方法.因为public除了可以通过public定义类的方法访问的行为之外没有任何行为,所以应该通过测试public方法来测试它们的行为.

  • @Tim Barrass:我想我正在和你说话.我的观点是,您不需要在密封类上模拟受保护的方法.它与private相同,并且不应在测试公共方法的隐式测试之外测试私有方法.无论何时你花半天时间做某事,或者担心你的孩子会继承这项工作,你都应该退后一步,问一下它是否值得.成本/收益是关键. (3认同)