我有一个C#抽象类,它在虚方法中有行为。我需要在该虚拟方法中对该行为进行单元测试(不是问题:何时调用该方法)。我看到三个选项:
1)创建抽象类的虚拟实现
2)使用子进程调用虚方法(每个子进程重复测试)
3)有人指出的另一种选择
我倾向于#1。这是测试这种行为最聪明的方法吗?
答案 0 :(得分:4)
理想情况下,您只想测试该类,因此请创建一个虚拟实现。如果您使用的是支持模拟类的模拟框架,那么这可能是最简单的方法。如果您的虚方法调用抽象类中定义的抽象(或虚拟)方法,则模拟框架将允许您验证是否发生了这些调用。 (另一方面,如果您对结果更感兴趣,那么您可能希望使用模拟框架来创建存根,而不是测试抽象类及其子类之间所涉及的确切协议。 )
答案 1 :(得分:1)
我个人总是为每个子实现创建重复测试。这样,如果有人来到并覆盖子类中的方法,您将破坏测试并知道它们需要重写。只需要一点额外的报道。
答案 2 :(得分:1)
最后,您应该质疑基类为什么需要实现新的默认实现。也许你应该委派?为什么要修改影响所有类的行为?
但是如果你必须修改所有孩子都应该继承的行为......
结合1和2。 使用假人作为对照测试进行测试。
然后使用至少1个行为的实际用法进行测试,以确保它适用于实际案例。
编写孩子的开发人员对他们的行为负责。
最终有人应该确保它在发布之前适用于所有现有的孩子,这样你就不会损坏这些孩子,但是如果你已经证明基类实现是有效的,那么任何改变应该来自扩展基础的那些对象类。