2009-10-29 3 views
5

Je rencontre des problèmes pour renvoyer un jeu de valeurs de session à partir de moqueurs à l'aide de Moq. En utilisant les éléments suivantsMoq Mocking and tracking Valeurs de session

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; 
     }); 
    } 
} 

Lorsque je tente d'obtenir la valeur à l'extérieur en utilisant

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

faire des choses qui définit session [ "id"]

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

sessionid se révèle être -1. Mais je peux obtenir la valeur de session définie en utilisant

th.sessionValue 

Qu'est-ce qui ne va pas? Je ne peux pas simplement retourner la valeur définie via Moq?

Répondre

11

Je dois arrêter de répondre à mes propres questions. Il se trouve que je devais se moquer de la session [ « id »] à nouveau comme si ...

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

Cela n'a pas fonctionné pour moi: @Konamimam semble être correct que le .Callback ne soit pas viré. La bonne approche semble être ici: http://stackoverflow.com/a/2921695/213609 –

2

Les méthodes Setup de Moq ne fonctionnent pas avec les propriétés indexées ayant des index de chaîne. Voir ici: How to MOQ an Indexed property

+0

si cela ne fonctionne pas, Session ["id"] ne devrait pas renvoyer la valeur null et pas -1? – sean

+0

En outre, les réponses à la question que vous avez liée semblent indiquer que cela fonctionne? –

1

C'est parce que vous retournez la valeur dans le getter qui a été adoptée par la valeur. Donc, chaque fois que vous appelez le getter, vous obtenez la même valeur retournée.

Modifiez les retours() pour utiliser un délégué afin qu'il soit évalué à chaque fois. De cette façon, vous obtiendrez la valeur correcte à chaque fois :)

Beaucoup plus facile à regarder qu'un SetupGet intégré dans 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

Je viens de passer beaucoup de temps à essayer de comprendre la meilleure façon de le faire avec moq, ci-dessous est un passé de copie de mon code qui a effectivement travaillé pour moi:

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; 

espérons que cette aide!