所以我想为我的业务逻辑层写一些测试用例。我已经嘲笑了我的数据访问层(它返回NHibernate IQueryOver
对象)。我创建了一个MockQueryOver
类,它实现了IQueryOver
接口,因为我在业务逻辑层中链接函数,因此创建存根IQueryOver
对我来说没有意义。模拟NHibernate的IQueryOverOrderBuilder对象
无论如何,这是所有的作品,但我遇到的问题是当我尝试在QueryOver
上做一个OrderBy()
。在我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,所以我不知道它在做什么在幕后,但似乎即使我创建的接口的模拟,当我尝试存根方法时仍然调用具体的扩展方法。
有人可以澄清这一点或帮助我解决这个问题吗?另外,因为我刚刚开始编写这些测试用例,所以我不介意改用模拟框架,只要它可以自由使用。
非常感谢!
是的,你是正确的,它是一个名为接口的具体类。你能否给我一个关于如何创建一个中间层的基本例子?我不确定我能做什么。 –
我在业务逻辑和NHibernate之间添加了更多关于创建抽象层的细节。我希望这是清楚和有益的。请问是否有什么不对。 –