Я начинаю новый проект с NHibernate, ASP.NET MVC 2.0 и StructureMap и использую NUnit и Moq для тестирования. Для каждого из моих контроллеров у меня есть один публичный конструктор, в который вставляется ISession. Само приложение работает просто отлично, но с точки зрения модульного тестирования, я, по сути, должен смоделировать ISession, чтобы протестировать контроллеры.
Когда я пытаюсь смоделировать ISession с помощью MOQ, я получаю следующее сообщение об ошибке:
Поддерживается только доступ к свойствам
в промежуточных вызовах
Похоже, что моя проблема заключается в ожидании списка пользователей из метода CreateQuery из фреймворка, но после поиска в Google проблемы я стал более понятным.
У меня есть два вопроса:
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);
}
Обратите внимание, я почти уверен, что мог бы просто создать жестко запрограммированный список пользователей (вместо того, чтобы издеваться над отдельным пользователем и добавлять его в список), но решил, что я оставлю код, как он есть сейчас.
Кроме того, действие Index этого конкретного контроллера по существу выполняет вызов CreateQuery, имитируемый выше, чтобы вернуть всех пользователей в базе данных. Это надуманный пример - не вдавайтесь в подробности.
Заранее спасибо за помощь
Редактировать: В ответ на комментарий ниже, я добавляю трассировку стека для ошибки. Кроме того, все свойства класса 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 (Expression
эксп) в
Moq.Mock.AutoMockPropertiesVisitor.SetupMocks (Expression
выражение) в
Moq.Mock.GetInterceptor (LambdaExpression
лямбда, издеваться над
Moq.Mock. <> C__DisplayClass12 2.<Setup>b__11()
at Moq.PexProtector.Invoke[T](Func
1
функция) в
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 ()