我一直致力于一个项目,我们使用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结果?在那一点上,如果我回复我实际要求的东西,似乎我实际上并没有测试任何有价值的东西......
我只是误解了一些基本的东西吗?
答案 0 :(得分:4)
在测试与数据库的交互(查询,插入)时,最好使用数据库,因为查询转换,约束等只能以这种方式进行测试。为了提高性能并进行测试隔离,通常使用内存数据库
blogpost from one of NHibernates contributers describing unit testing with NHibernate and sqlite