【问题标题】:How to structure unit tests when you want to test interactions of derived classes wih base class当您想要测试派生类与基类的交互时如何构建单元测试
【发布时间】:2013-07-13 05:37:26
【问题描述】:

我开始按照 Phil Haack 建议的here 的方式组织我的单元测试。我的测试类每个被测公共方法都有一个嵌套类。嵌套类派生自外部类,以便继承其设置代码。

我现在有一个案例,我想测试一个抽象基类和两个派生类的简单层次结构。我想显式地测试每个派生类与基类的交互,而不是使用某种模拟派生类测试基类。

我过去曾使用一个基础测试夹具和每个派生类一个派生夹具来完成此操作,其中派生夹具必须为基础夹具中的测试实现一些模板方法:

[TestFixture]
public abstract class BaseFixture
{
    protected abstract MyBaseClassUnderTest GetTestInstance();

    [Test]
    public void SomeMethod_SomeCondition_SomeOutcome()
    {
        var sut = GetTestInstance();

        //test base class behavior here
    }

    //More base class tests here
}

public class DerivedFixture : BaseFixture
{
    protected override MyBaseClassUnderTest GetTestInstance()
    { 
        return new DerivedInstance(); 
    }

    //Tests for derived class go here
}

有没有人有想法,我该如何解决这个问题?现在我看不到如何结合这两种方法,因为继承策略不同(从外部类继承设置代码与从基类夹具继承基类测试)。

【问题讨论】:

    标签: c# .net unit-testing nunit


    【解决方案1】:

    这是一个非常有趣的问题,当然多重继承是不可能的,因此我猜你需要找到你正在使用的两种继承策略之一的替代方案。

    个人意见是,您应该保留 Haack 组织测试的方法以确保整个测试套件的一致性,并寻找一种替代方法来通过类层次结构共享测试。我所知道的与多重继承最接近的概念是Mixins,如果您查看Is it Possible to Implement Mixins in C# 的这个答案,似乎可以使用扩展方法模拟混合。我会沿着这条路走——this blog post 讨论了创建可以访问使用它们的类中保存的数据的 mixin 的可能策略,我相信您需要这些策略才能将派生类实例提供给您的基类级别测试(即替换GetTestInstance)。

    【讨论】:

    • 这是一个有趣的想法,但你能想到一个 NUnit 测试夹具的实际示例,测试运行器实际上能够运行它吗?我不能。
    猜你喜欢
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 2023-03-15
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多