0

我一直在做一个项目,我们使用 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 列表,并且然后使用它从与母公司关联的所有公司中获取所有老年人。

我不确定是否有什么好方法可以在不访问数据库的情况下对其进行测试。

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

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

4

1 回答 1

4

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

来自 NHibernates 贡献者之一的博文,描述了使用 NHibernate 和 sqlite 进行单元测试

于 2012-09-19T10:03:17.123 回答