Итак, я пытаюсь написать несколько тестовых примеров для моего уровня бизнес-логики. Я уже высмеял свой уровень доступа к данным (который возвращает объекты NHibernate IQueryOver
). Я создал класс MockQueryOver
, который реализует интерфейс IQueryOver
, потому что я цепляю функции на уровне бизнес-логики, поэтому создание заштрихованного IQueryOver
для меня не имеет смысла.Mock NHibernate Объект IQueryOverOrderBuilder
В любом случае, все работает, но проблема, с которой я сталкиваюсь, - это когда я пытаюсь сделать 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 бросает исключение на любом из методов заглушки. Это исключение:
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. Надеюсь, это понятно и полезно. Пожалуйста, спросите, нет ли чего-то. –