【问题标题】:NHibernate Generated values and TestingNHibernate 生成的值和测试
【发布时间】:2011-03-06 00:56:14
【问题描述】:

我正在使用 NHibernate 进行数据访问。我正在为我的数据访问层编写一些测试,并且有一个场景,我正在选择特定日期范围内的记录。

在测试中,我仅通过在一个范围内选择随机日期来生成测试数据,然后我尝试选择日期在该范围子集内的记录。例如,我生成日期在昨天和明天之间的记录,然后我只选择日期为今天的记录。

问题是这些日期通常是由数据库生成的——它们基本上设置为generated="insert"。有没有一种方法可以设置 NHibernate,以便在用户未提供日期时使用 DB 生成的日期?

如果没有,是否有人在测试期间制定了缓解此问题的策略?

【问题讨论】:

    标签: unit-testing nhibernate default-value


    【解决方案1】:

    在构造实体时,将实体上的 DateTime 属性初始化为 DateTime.Now。给它一个受保护的设置器,并在您的测试代码中实现一个派生类型,该类型公开一个设置它的方法。

    例如

    public class RealEntity
    {
        public virtual int Id { get; private set;}
        ...
        public virtual DateTime Created { get; protected set; }
    }
    
    [TestFixture]
    public class SomeTest
    {
        ...
    
        public class Testable : RealEntity
        {
            public void SetCreatedDate(DateTime date)
            {
                Created = date;
            }
        }
    }
    

    【讨论】:

    • 我发现暴露私人/受保护的东西是可疑的。您建议您将测试与被测试类的内部结构相结合的方式。基本上你测试Testable 而不是RealEntity 从而破坏了单元测试的整个想法。
    • 说它“打败了单元测试的整个想法”是极端的。我提出的选项是使用 nhibernate 或使用代理类(或反射)使用非公共设置器设置属性的任何其他方法时遇到的常见问题的解决方法。按照我的建议对被测类进行子类化模拟了 nhibernate 对动态代理所做的操作,因此可以将实例置于一种状态,就好像它已被 nhibernate 水合一样,而所有其他行为都保持不变。这并不理想,我很想听到替代方案,但它是可行的。
    猜你喜欢
    • 2016-05-09
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 2011-06-12
    相关资源
    最近更新 更多