Я начинаю новый проект с NHibernate, ASP.NET MVC 2.0 и StructureMap и используя NUnit и Moq для тестирования. Для каждого из моих контроллеров у меня есть единственный публичный конструктор, в который вводится ISession. Само приложение работает очень хорошо, но с точки зрения модульного тестирования я, по сути, должен издеваться над ISession, чтобы протестировать контроллеры.Стыковка NHibernate ISession с Moq
При попытке дразнит ISession с MOQ я получаю следующее сообщение об ошибке:
только доступы собственности поддерживаются в промежуточных заклятиях
Оказывается, что моя проблема ожидает список пользователей из метода CreateQuery Framework, но после того, как я перешел к проблеме, я теперь более ясен.
У меня есть два вопроса:
1) Является ли это неправильный способ издеваться инъекции зависимостей из ISession
2) Есть ли способ изменить код, чтобы он мог успешно вернуть мой список
[Test]
public void DummyTest()
{
var mock = new Mock<ISession>();
var loc = new Mock<User>();
loc.SetupGet(x => x.ID).Returns(2);
loc.SetupGet(x => x.FirstName).Returns("John");
loc.SetupGet(x => x.LastName).Returns("Peterson");
var lst = new List<User> {loc.Object};
mock.Setup(framework => framework.CreateQuery("from User").List<User>()).Returns(lst);
var controller = new UsersController(mock.Object);
var result = controller.Index() as ViewResult;
Assert.IsNotNull(result.ViewData);
}
Пожалуйста, обратите внимание, я уверен, что я мог бы просто создать жестко запрограммированный список пользователей (а не издевается отдельного пользователя и добавления его в список), но полагал, что я оставил бы код, как я его прямо сейчас.
Кроме того, действие индекса этого конкретного контроллера по существу выполняет вызов CreateQuery, посланный выше, чтобы вернуть всех пользователей в базу данных. Это надуманный пример - ничего не читайте в деталях.
Заранее спасибо за помощь
Edit: В ответ на комментарии ниже, я добавляю в StackTrace для ошибки. Кроме того, все свойства класса User являются виртуальными.
TestCase 'Beta.Tests.Unit.Controllers.UserControllerTest.Details_InValidIndex_ReturnsNotFoundView' не удалось: System.NotSupportedException: только доступы собственности поддерживаются в промежуточных вызовах на установки. Неподдерживаемое выражение framework.CreateQuery («от пользователя»). на Moq.Mock.AutoMockPropertiesVisitor.VisitMethodCall (MethodCallExpression м) на Moq.ExpressionVisitor.Visit (Expression ехр) при Moq.Mock.AutoMockPropertiesVisitor.VisitMethodCall (MethodCallExpression м) на Moq.ExpressionVisitor.Visit (Выражение ехра) при Moq.Mock.AutoMockPropertiesVisitor.SetupMocks (выражение выражения) в Moq.Mock.GetInterceptor (LambdaExpression лямбды, Ложная макет) при Moq.Mock. <> c__DisplayClass12 функция) при Moq.Mock.Setup [T1, TResult] (Mock Mock, Выражение
1 expression) at Moq.Mock
1.Setup [TResult] ( выражение Expression`1) Контроллеры \ UserControllerTest.CS (29,0): в Beta.Tests.Unit.Controllers.UserControllerTest.Details_InValidIndex_ReturnsNotFoundView()
Не могли бы вы отобразить стопку ошибки? Являются ли свойства пользователя абстрактными или виртуальными? –