2009-10-29 13 views
5

Tengo problemas para devolver un valor de sesión establecido desde la burla con Moq. Utilizando la siguienteMoq Mocking y tracking Valores de la sesión

public class TestHelpers 
{ 
public long sessionValue = -1; 
public HttpContextBase FakeHttpContext() 
{ 

    var httpContext = new Mock<HttpContextBase>(); 
    var session = new Mock<HttpSessionStateBase>(); 
    httpContext.Setup(x => x.Session).Returns(session.Object); 
    httpContext.SetupGet(x => x.Session["id"]).Returns(sessionValue); 
    httpContext.SetupSet(x => x.Session["id"] = It.IsAny<long>()) 
     .Callback((string name, object val) => 
     { 
      sessionValue = (long)val; 
     }); 
    } 
} 

Cuando trato de obtener el valor fuera usando

var th = new TestHelpers(); 
HttpContextBase httpContext = th.FakeHttpContext(); 

hacer algunas cosas que establece Sesión [ "id"]

var sessionid = httpContext.Session["id"]; 

sessionid resulta ser -1. Pero puedo obtener el valor de la sesión establecida usando

th.sessionValue 

¿Qué pasa? ¿No puedo simplemente devolver el valor establecido a través de Moq?

Respuesta

11

Tengo que dejar de responder mis propias preguntas. Resulta que necesitaba para burlarse de Sesión [ "id"] de nuevo como tal ...

httpContext.SetupSet(x => x.Session["id"] = It.IsAny<long>()) 
     .Callback((string name, object val) => 
     { 
      sessionValue = (long)val; 
      httpContext.SetupGet(x => x.Session["id"]).Returns(sessionValue); 
     }); 
+0

Esto no funcionó para mí: @Konamimam parece estar en lo cierto al decir que no se activa el .Callback. El enfoque correcto parece estar aquí: http://stackoverflow.com/a/2921695/213609 –

2

Los métodos Setup de Moq no funcionan funcionan con propiedades indexadas que tienen índices de cadena. Vea aquí: How to MOQ an Indexed property

+0

si no funciona, ¿no debería la Sesión ["id"] devolver nulo y no -1? – sean

+0

Además, las respuestas a la pregunta a la que se vinculó parecen indicar que funciona? –

1

Es porque usted está volviendo el valor en el captador que se pasa por valor. Entonces, cada vez que invocas el getter, obtienes el mismo valor devuelto.

Cambie las devoluciones() para usar un delegado, por lo que se evalúa cada vez. De esta forma obtendrá el valor correcto cada vez :)

Mucho más fácil de ver que un SetupGet incrustado dentro de un SetupSet.

httpContext.SetupSet(x => x.Session["id"] = It.IsAny<long>()) 
     .Callback((string name, object val) => sessionValue = (long)val); 
httpContext.SetupGet(x => x.Session["id"]).Returns(() => sessionValue); 
1

Me acabo de pasar mucho tiempo tratando de encontrar la manera más fácil de hacerlo con moq, a continuación es un pasado ejemplar de mi código que realmente funcionó para mí:

var _adminctrl = new Moq.Mock<AdminController>(); //AdminController is my MVC controller 

var mock = new Mock<ControllerContext>(); 
mock.Object.Controller = _adminctrl.Object; 
mock.Setup(p => p.HttpContext.Session["UserInfoKey"]).Returns(new ViewModel()); 
//here is the catch, attaching the ControllerContext to your controller 
_adminctrl.Object.ControllerContext = mock.Object; 

esperanza que esto ayude!