3

似乎有三种通用模式可用于测试派生类与其基类1交互的方式。由于我在下面列出的原因,我真的不喜欢它们中的任何一个。有没有人使用其中一种(或另一种)测试基类交互的方法取得了长期成功?

  • 更改访问修饰符以允许Friendinternal在 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 中任何非编译时类型的安全模拟(我认为这是一件好事!)

4

1 回答 1

4

只是我的拙见。

一般来说,测试与基类的交互并不是一个好主意。因为您将在此处测试实现细节

如果与基类一起测试继承类似乎很复杂,那么可能是时候重构并使用聚合而不是继承了?

于 2012-12-12T21:05:34.330 回答