2012-09-19 32 views
0

我一直在使用Fluent NHibernate ORM访问SQL Server数据库并显示和处理数据的项目。我可以合理地模拟这个NHibernate查询吗?

在最初的开发阶段,我们一直在写实际数据库的单元测试;这对于学习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(类流利地映射到数据库表的类)以获取连接到母公司的公司的CompanyIds列表,然后使用此列表从所有与公司关联的公司获取所有公司的公司列表母公司

什么我不确定是否有任何好的方法来测试这个没有去数据库。

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

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

+3

如果我理解正确的,你想测试,如果你的NHibernate的查询实际上提供你所需要的,不只是提供一个嘲笑GetAllOrders返回结果订单清单。在这种情况下,我会选择内存中的sqlite数据库,并在测试开始时填入测试数据。 –

+0

你使用什么模拟框架? – larsmoa

+0

GarlandGreene是个不错的提示,我认为你已经理解了这种情况,我认为内存测试听起来像是一个聪明的想法。 虽然我很好奇听到有人认为Mock Objects将会走向何方。 至于我的框架,我没有真正致力于任何。我一直在用Moq进行大部分测试,但没有理由不改变。 –

回答

4

当测试与数据库的交互(查询,插入)时,最好是使用数据库,因为查询翻译,约束等只能以这种方式进行测试。为了提高性能,并具有检测分离的内存数据库经常被用来

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

+0

你应该提供更多的内容/文本(即使是复制)作为解释。按照现状,它更多的是作为评论而不是答案。恕我直言。 –

+1

确定已扩展它。 – Firo

+0

好的+1然后:-) –