如何在抽象类上对虚方法进行单元测试

本文关键字:方法 单元测试 抽象类 | 更新日期: 2023-09-27 18:04:51

我有一个c#抽象类,它在一个虚拟方法中具有行为。我需要在那个虚拟方法中对那个行为进行单元测试(没有问题:当那个方法被调用时)。我看到三个选项:

1)创建抽象类的虚拟实现2)使用子类调用虚拟方法(每个子类实现重复测试)
3)另一个选项

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

如何在抽象类上对虚方法进行单元测试

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

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

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

但是如果您必须修改所有子节点都应该继承的行为…

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

然后使用该行为的至少一个实际用法来测试,以确保它在实际情况下工作。

为孩子编写代码的开发者要对他们的行为负责。

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