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