【发布时间】:2019-02-09 06:24:29
【问题描述】:
我有以下对象结构:
public class A
{
//...
public B b;
//...
}
public class B
{
//...
public C c;
//...
}
public class C
{
//...
//...
}
我想创建一些测试来编写数据库访问代码。为了实现这一点,在每次测试之前,我都会在数据库中添加一些必要的数据(我使用的是 fluent nHibernate)。
所以要测试对实体 A 执行某些操作的某些数据库方法,我需要将 A 类的对象保存到数据库中
//...
var a = new A();
session.Save(a);
//...
这会导致空引用异常,因为 B 类和 C 类的对象也是不能为空的数据库实体。
我的问题是如何通过使用 Moq 以优雅的方式避免这种异常。在我真正的问题中,对象树比这个简化的问题要复杂得多。
【问题讨论】:
-
在您的情况下,是否有必要 100% 使用真正的数据库?从理论上讲,您能否模拟出整个“会话”对象? (就像我们目前在我的项目中所做的那样,仅使用 EF dbContext)
-
我认为,mock session 对象就足够了,但是当涉及到这个对象树关系时,它会发生什么变化?
-
模拟
ISession将允许您拥有A和nullB(避免保存到db = nullref exc)。检查this answer。然后,您可以设置您的ISession以返回您的简单List<A> -
但是,实际上我想测试我的复杂数据库查询,例如:获取给定时间段内包含某些属性的所有对象
-
好的,根据这些 cmets,我将尝试发布带有一些选项的答案
标签: c# nhibernate moq