NHibernate如何简化单元测试?

时间:2011-06-05 01:52:46

标签: unit-testing nhibernate orm

NHibernate使用XML文件将类映射到数据库中的表。单元测试XML文件如何比程序代码(C#,JAVA等)更容易? NHibernate是否认为映射XML文件是自动完美的,并且不需要对它们进行测试?

4 个答案:

答案 0 :(得分:1)

Fluent NHibernate使用类而不是XML进行映射,我相信对测试有一些支持。

答案 1 :(得分:0)

对您的DAO进行单元测试,它封装了您的NHibernate查询,以验证您的NHibernate配置/映射是否正确。

答案 2 :(得分:0)

在过去的几年里,我采取了3种不同的方法:

1 - 不做任何测试。找出何时部署到测试服务器的映射是否正确。这不太理想。

2 - 我写了一些代码,使用反射,找到我所有的映射POCO并自动实例化它们(它有点递归,所以它甚至可以探索外键)然后从数据库中取回它们以查看是否所有属性都保持正确。

3 - 围绕我的Web服务编写了集成测试。我允许这些测试运行一直到数据库的Web服务代码。这出现了任何映射问题。

编辑 - 我要提到的另一件事是NHibnerate确实有一个很好的功能,你可以使用内存数据库。这对于您不想模拟NHibnerate但不希望测试依赖于(真实)数据库服务器的测试非常有用。

答案 3 :(得分:0)

我不确定这是否可以解决你的问题...基本上如果你使用nhibernate然后你最好使用流利的nhibernate。实际上使用POCO而不是hbm.xml映射来构建代理类,这使得生活更容易重构...

关于单元测试的问题我自己正在为单元测试场景寻找一些线索..例如,如果你有一个学生属于部门,那么你实际上需要编写测试用例。您不需要从部署中进行手动测试的任何编码。这将解决现在的手动测试问题,因为编写测试夹具使你在没有人工检查的情况下测试你自己的代码会更容易

这是一个例子

[TestFixtureSetUp]
    public void CanMapCorrectlyStudent()
    {
        using (ISession session = PersistanceManager.OpenSession())
        {
            new PersistenceSpecification<Student>(session)  
                .CheckProperty(c=>c.Studentid,5)
                .CheckProperty(c => c.Name, "John")
                .CheckProperty(c=>c.Age , 24)                                        
                .CheckReference(c=>c.Department,new Department { Dept_id = 1 , Dept_name="MCA" })
                .VerifyTheMappings();
        }
    }

你可以在nhibernate wiki中找到相应的例子,以及为visual studio安装testdriven.net,右键单击上面提到的这个函数体并单击run test。它会自动运行测试,让您免除手动编码和重新检查测试的所有麻烦