Estoy comenzando un nuevo proyecto con NHibernate, ASP.NET MVC 2.0 y StructureMap y usando NUnit y Moq para probar. Para cada uno de mis controladores tengo un único constructor público en el que se está inyectando una ISession. La aplicación en sí funciona bien, pero en términos de pruebas unitarias, esencialmente tengo que burlarme de una ISession para probar los controladores.Mocking una ISession de NHibernate con Moq
Cuando intento para burlarse del ISession con MOQ me sale el siguiente mensaje de error:
Sólo se admiten los accesos de propiedad en las invocaciones intermedios
Parece que mi problema está a la espera Lista de usuarios del método Framework CreateQuery, pero después de buscar en Google el problema, ahora estoy más claro.
Tengo dos preguntas:
1) ¿Es este el camino equivocado para burlarse de la inyección de dependencia de un ISession
2) ¿Hay una manera de modificar el código para que pueda regresar con éxito mi lista
[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);
}
Tenga en cuenta, estoy bastante seguro de que sólo pudiera crear una lista no modificable de los usuarios (en lugar de burlarse de un usuario individual y agregarlo a una lista), pero pensé que podría dejar el código como lo tengo ahora mismo.
Además, la acción de índice de este controlador en particular ejecuta esencialmente la llamada CreateQuery imitada anteriormente para devolver todos los usuarios en la base de datos. Este es un ejemplo artificial: no lea nada en los detalles.
Gracias de antemano por su ayuda
Editar: En respuesta al comentario más abajo, estoy añadiendo la StackTrace por el error. Además, todas las propiedades de la clase User son virtuales.
TestCase 'Beta.Tests.Unit.Controllers.UserControllerTest.Details_InValidIndex_ReturnsNotFoundView' falló: System.NotSupportedException: sólo accede a la propiedad son compatibles en las invocaciones intermedios en una configuración . Expresión no compatible framework.CreateQuery ("del usuario"). en Moq.Mock.AutoMockPropertiesVisitor.VisitMethodCall (MethodCallExpression m) en Moq.ExpressionVisitor.Visit (Expresión exp) en Moq.Mock.AutoMockPropertiesVisitor.VisitMethodCall (MethodCallExpression m) en Moq.ExpressionVisitor.Visit (Expresión exp) en Moq.Mock.AutoMockPropertiesVisitor.SetupMocks (expresión la expresión) a Moq.Mock.GetInterceptor (LambdaExpression lambda, mock Mock) en Moq.Mock. <> c__DisplayClass12 función) en Moq.Mock.Setup [T1, TResult] (mock Mock, Expresión
1 expression) at Moq.Mock
1.Setup [TResult] (Expression`1 expresión) Controllers \ UserControllerTest.cs (29,0): en Beta.Tests.Unit.Controllers.UserControllerTest.Details_InValidIndex_ReturnsNotFoundView()
¿Pudo mostrar un error de pila del error? ¿Las propiedades del usuario son abstractas o virtuales? –