似乎有三种通用模式可用于测试派生类与其基类1交互的方式。由于我在下面列出的原因,我真的不喜欢它们中的任何一个。有没有人使用其中一种(或另一种)测试基类交互的方法取得了长期成功?
- 更改访问修饰符以允许
Friend
(internal
在 C# 中)访问并设置InternalsVisibleTo
为包含模拟框架/单元测试程序集
更改 SUT 以进行测试是一种测试气味。如果方法是Protected
,那是Protected
因为那是适合它的设计(实际上我还没有看到我称之为Protected Friend
( protected internal
) 的“有效”使用)。
- 使用反射和扩展方法来创建要模拟的方法的可访问版本......然后模拟它
这需要大量额外的工作来模拟单个方法,它不是完全类型安全的(例如,重命名会杀死它),并且(至少在 VB 中),需要创建一个Module
将方法放入其中,这是一种设计噩梦(模块不能进入类,所以它们Friend
最多需要受到限制,而且你的泛型更复杂)!
- 使用状态测试而不是行为测试。
根据基类的复杂程度,这可能需要比针对同一事物的单个行为测试更多的测试。考虑在状态测试中需要什么来匹配Me.AssertWasCalled(Function(s) s.SendMessage(messageText, [to]))
whereSendMessage
是基类Protected
方法。
1String
注意:在支持通过方法名称模拟受保护方法的 Moq 中,这不是必需的。正如 Ayende 在上面的链接中提到的,他特别避免了 Rhino Mocks 中任何非编译时类型的安全模拟(我认为这是一件好事!)