【问题标题】:How to unit test a virtual method on an abstract class?如何对抽象类的虚拟方法进行单元测试?
【发布时间】:2011-10-21 01:58:56
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# unit-testing virtual abstract


    【解决方案1】:

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

    【讨论】:

    • 我正在使用 Rhino Mocks,它为我提供了一个抽象类的实例。但是我/认为/它将/不允许/允许我在该实例上执行虚拟方法。它将无条件返回输出类型的默认值。相关:stackoverflow.com/questions/6960459/…
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      但是如果你必须修改所有孩子都应该继承的行为......

      结合 1 和 2。 使用假人作为对照测试进行测试。

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多