2009-10-29 18 views
5

Ho problemi a restituire un valore di Session impostato da mocking utilizzando Moq. Utilizzando il seguenteMoq Mocking and tracking Valori di sessione

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

Quando provo ad ottenere il valore esterno utilizzando

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

fare alcune cose che imposta Session [ "id"]

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

sessionid risulta essere -1. Ma posso ottenere il valore della sessione impostata utilizzando

th.sessionValue 

Cosa c'è che non va? Non posso semplicemente restituire il valore impostato tramite Moq?

risposta

11

Ho bisogno di smettere di rispondere alle mie domande. Si scopre che avevo bisogno di prendere in giro Session [ "id"] di nuovo in questo modo ...

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

Questo non ha funzionato per me: @ Konamimam sembra essere corretto sul fatto che il .Callback non viene licenziato. L'approccio corretto sembra essere qui: http://stackoverflow.com/a/2921695/213609 –

2

I metodi di Moq Setup non funzionano con proprietà indicizzate con indici stringa. Vedi qui: How to MOQ an Indexed property

+0

se non funziona, la Session ["id"] non restituisce null e non -1? – sean

+0

Inoltre, le risposte alla domanda che hai collegato sembrano indicare che funziona? –

1

È perché stai tornando il valore nel getter che è stato passato per valore. Quindi ogni volta che invochi il getter, ottieni lo stesso valore restituito.

Modificare i valori restituiti() per utilizzare un delegato in modo che venga valutato ogni volta. In questo modo otterrai ogni volta il valore corretto :)

Molto più facile per gli occhi di un SetupGet incorporato in 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

Ho appena trascorso molto tempo cercando di capire il modo più semplice per farlo con moq, sotto è un passato copia del mio codice che in realtà ha funzionato per me:

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; 

speranza che questo aiuti!