我可以明智地模拟这个NHibernate查询吗?

时间:2012-09-19 08:21:51

标签: c# unit-testing nhibernate mocking

我一直致力于一个项目,我们使用Fluent NHibernate ORM访问SQL Server数据库并显示和操作数据。

在最初的开发阶段,我们一直在针对实际数据库编写单元测试;这有助于学习NHibernate,但这并不理想,因为数据库并不总是具有我们需要测试的内容,并且运行测试的时间开始太长。

所以我希望在单元测试中尝试使用模拟对象,我有很少的模拟经验,现在我不能总是看到如何更改功能以允许我这样做。

这是我昨天写的一个函数(重写为更抽象的概念。但基本上我的代码有不同的类名:

 public static IList<Order> GetAllOrders(long parentCompanyId)
    {
        using (var session = DbSetup.GetSession())
            {
                var idList =
                    (from p in session.Query<ParentCompanyList>() 
                     where p.ParentCompanyId == parentCompanyId 
                     select p.CompanyId)
                     .ToList<long>();

                IQuery q = session.CreateQuery("from Order as o where o.CompanyId in (:ids)");
                q.SetParameterList("ids", idList);

                var results = q.List<Order>();
                return results;
            }
    }

所以我有一个连接到数据库的NHibernate.ISession,我正在运行一个查询来查找ParentCompanyList(流量映射到数据库表的类)以获取连接到父项的公司的CompanyId列表公司,然后使用它来获取与母公司相关的所有公司的所有olders。

我不确定是否有任何好方法可以在不进入数据库的情况下进行测试。

我可以创建允许我测试它的模拟对象吗?我该如何设置? 我是否需要创建一个模拟ISession,它将返回相应的List和IOrder结果?在那一点上,如果我回复我实际要求的东西,似乎我实际上并没有测试任何有价值的东西......

我只是误解了一些基本的东西吗?

1 个答案:

答案 0 :(得分:4)

在测试与数据库的交互(查询,插入)时,最好使用数据库,因为查询转换,约束等只能以这种方式进行测试。为了提高性能并进行测试隔离,通常使用内存数据库

blogpost from one of NHibernates contributers describing unit testing with NHibernate and sqlite