【问题标题】:How to unit test with a recursive object如何使用递归对象进行单元测试
【发布时间】:2011-05-10 21:38:25
【问题描述】:

我有一个对象在构造函数中接受相同类型的参数:

public class Person {
    private Person theParent;
    private string theName;
    public Person(string aName, Person aParent)
    {
        if(aParent == null)
        {
            thrown new ArgumentNullException("aParent");
        }
        theParent = aParent;
        theName = aName;
    }
}

在我的单元测试中,我必须创建一个新的 Person 对象,但构造函数需要传入另一个 Person 对象。我通过从数据库(使用 NHibernate 及其所有魔法)*。我不想将数据库访问绑定到此测试中,因为它没有测试任何数据库功能。我应该只模拟父对象(我在其他一些测试中使用 Rhino Mocks)还是有更好的方法来解决这个问题?

*保证数据库中始终有一条记录可以检索以创建父对象。

【问题讨论】:

    标签: c# unit-testing rhino-mocks


    【解决方案1】:

    我假设在某些时候您应该到达顶部节点?那么aParent 的正确值是多少?

    我的猜测是null,这意味着Person 是它的第一个(无论这对您的应用程序意味着什么,也许Adam 或其他什么?)。

    【讨论】:

    • 是的,有一个顶级节点,它是应用程序在正常使用期间从数据库中检索的节点。所有其他节点都要求提供父节点。出于完整性原因,Null 不是允许的父级。
    • 我认为Person 类比您的代码显示的更高级,但是该顶级节点的状态是否对您的测试不可或缺?如果没有,您很可能会使用简单的模拟对象获得良好的结果。但是,如果数据库中的实际对象 是测试的组成部分,则这很可能是一个集成测试,您应该将其与单元测试分开,然后继续从数据库中读取。
    • 啊,经过您的编辑,我建议使用模拟对象进行单元测试。
    【解决方案2】:

    您可以测试递归函数调用的副作用,例如使用计数器字段变量来检查调用次数,将调用参数存储在单元测试可以检查它们的某种容器中等等。当然,您将在发布版本中删除所有这些东西。

    【讨论】:

      猜你喜欢
      • 2014-08-20
      • 2012-01-08
      • 2010-09-11
      • 2021-12-22
      • 2023-03-06
      • 2011-12-19
      • 2014-01-06
      • 2019-11-02
      • 1970-01-01
      相关资源
      最近更新 更多