c# - 当您想要测试派生类与基类的交互时如何构建单元测试

标签 c# .net unit-testing nunit

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

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

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

[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
}

有人知道我该如何解决这个问题吗?现在我不知道如何结合这两种方法,因为继承策略不同(从外部类继承设置代码与从基类固定装置继承基类测试)。

最佳答案

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

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

关于c# - 当您想要测试派生类与基类的交互时如何构建单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17652831/

相关文章:

c# - 从字符串到方法

c# - for循环中的sql

django - 使用 Tastypie 进行多部分请求单元测试

c# - 如何使用单元测试测试以下场景?

c# - 如何让标签撞到墙上时改变方向?

c# - 将应用程序转换为支持时需要考虑哪些因素?

c# - 使用 linq 选择符合我的条件的对象

c# - 创建 protected 链接

java - 编写长测试方法名称来描述测试与在代码文档中使用

c# - 在 Windows 资源管理器中打开 Windows 7 库