关于C#:如何在抽象类上对虚拟方法进行单元测试?

How to unit test a virtual method on an abstract class?

我有一个抽象类,它在虚拟方法中有行为。我需要在该虚拟方法中对该行为进行单元测试(不存在问题:何时调用该方法)。我看到三个选项:

1)创建抽象类的虚拟实现2)使用子级调用虚拟方法(每个子级实现重复测试)3)这里有人指出的另一个选择

我倾向于1。这是测试这种行为的最聪明的方法吗?


理想情况下,您只想测试那个类,所以创建一个虚拟实现。如果您使用的是支持模拟类的模拟框架,那么这可能是最简单的方法。如果虚拟方法调用抽象类中定义的抽象(或虚拟)方法,模拟框架将允许您验证这些调用是否发生。(另一方面,如果您对结果更感兴趣,而不是测试抽象类及其子类之间所涉及的确切协议,那么您可能希望使用模拟框架来创建存根。)


最后,您应该质疑为什么基类需要实现一个新的默认实现。也许你应该授权?为什么要修改影响所有类的行为?

但如果你必须修改所有子代都应该继承的行为…

组合1和2。使用假人作为对照试验。

然后使用至少1个行为的实际用法进行测试,以确保它适用于实际情况。

编写孩子的开发人员对他们的行为负责。

最终,应该有人确保它在发布之前与所有现有的子类一起工作,这样您就不会破坏这些子类,但是如果您已经证明了基类实现是有效的,那么任何更改都应该来自扩展基类的对象。


我个人总是为每个子实现创建重复的测试。这样,如果有人来重写子类中的方法,您将中断测试,并知道需要重新编写它们。只是一点额外的保险。