所以我正在尝试为我的业务逻辑层编写一些测试用例。我已经模拟了我的数据访问层(它返回 NHibernateIQueryOver
对象)。我创建了一个MockQueryOver
实现IQueryOver
接口的类,因为我在业务逻辑层中链接了函数,所以创建存根IQueryOver
对我来说没有意义。
无论如何,这一切都有效,但我遇到的问题是当我尝试OrderBy()
在QueryOver
. 在我的MockQueryOver
课堂上,我现在实现这样的OrderBy()
方法:
public IQueryOverOrderBuilder<TRoot, TSubType> OrderBy(Expression<Func<TSubType, object>> path)
{
var func = path.Compile();
IList<TSubType> result = m_data.OrderBy(func).ToList();
var mockRepo = new MockRepository();
var queryOver = new MockQueryOver<TRoot, TSubType>(m_data);
IQueryOverOrderBuilder<TRoot, TSubType> mockOrderBuilder = mockRepo.StrictMock<IQueryOverOrderBuilder<TRoot, TSubType>>(queryOver, path);
mockOrderBuilder.Stub(x => x.Desc).Return(queryOver);
mockOrderBuilder.Stub(x => x.Asc).Return(queryOver);
return mockOrderBuilder;
}
问题是 RhinoMocks 会在任何 Stub 方法上抛出异常。这是一个例外:
System.NullReferenceException : Object reference not set to an instance of an object.
at NHibernate.Criterion.Lambda.QueryOverOrderBuilderBase`3.AddOrder(Func`2 orderStringDelegate, Func`2 orderDelegate)
at NHibernate.Criterion.Lambda.QueryOverOrderBuilderBase`3.get_Desc()
at NHibernate.Criterion.QueryOverBuilderExtensions.Desc(IQueryOverOrderBuilder`2 builder)
at BLL.Tests.Mock_Objects.MockQueryOver`2.<OrderBy>b__7(IQueryOverOrderBuilder`2 x) in MockQueryOverSubType.cs: line 239
我是 NHibernate 和 RhinoMocks 的新手,所以我不确定它在幕后做了什么,但似乎即使我正在创建一个接口的模拟,当我尝试存根时它仍然调用具体的扩展方法方法。
有人可以澄清一下或帮助我解决这个问题吗?另外,由于我刚刚开始编写这些测试用例,我不介意切换模拟框架,只要它可以免费使用。
非常感谢!