2011-05-10 47 views
2

我有一个对象,需要在同一类的构造函数中的参数:如何单元测试与递归对象

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对象。我通过从数据库中传入Person对象(使用NHibernate及其所有的魔法)*来克服此问题。我不想将数据库访问绑定到此测试中,因为它不测试任何数据库功能。我应该嘲笑父对象(我在其他一些测试中使用Rhino Mocks)还是有更好的方法来处理这个问题?

*保证在数据库中总是有一条记录可以检索到父对象。

回答

1

我认为在某些时候你期望达到顶级节点?那么aParent的正确值是多少?

我的猜测是null,这将意味着这Person是第一个在它的线(不管这意味着您的应用程序,可能Adam什么?)。

+0

是的,有一个顶层节点是应用程序在正常使用期间从数据库中检索到的节点。所有其他节点都要求提供父代。出于完整性原因,Null不是允许的父级。 – brainimus 2011-05-10 21:45:57

+0

我假设'Person'类比你的代码显示更高级,但是顶层节点的状态是否是你的测试不可或缺的一部分?如果不是的话,你很可能会用一个简单的模拟对象获得好的结果。 如果数据库中的实际对象不过*是测试的积分,这很可能是集成测试,您应该将它与单元测试分开,然后继续从数据库读取数据。 – 2011-05-10 21:49:05

+0

啊,在你编辑之后,我会建议一个单元测试的模拟对象。 – 2011-05-10 22:02:52

0

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