2009-10-29 10 views
5

Ich habe Probleme beim Zurückgeben einer Session-Wert-Set von Mock mit Moq. Unter Verwendung der folgendenMoq Mocking und Tracking Session-Werte

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

Wenn ich versuche, den Wert zu erhalten, außerhalb

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

ein paar Sachen tun verwenden, die Session setzt [ "id"]

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

sessionid erweist sich sei -1. Aber ich kann den eingestellten Sitzungswert mit

th.sessionValue 

erhalten Was ist los? Kann ich den Sollwert nicht einfach über Moq zurückgeben?

Antwort

11

Ich muss aufhören, meine eigenen Fragen zu beantworten. Es stellt sich heraus, dass ich brauchte Session zu verspotten [ „id“] wieder wie so ...

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

Das hat bei mir nicht funktioniert: @Konamimam scheint korrekt zu sein, dass der Callback nicht ausgelöst wird. Der richtige Ansatz scheint hier zu sein: http://stackoverflow.com/a/2921695/213609 –

2

Moqs Setup Methoden funktionieren nicht mit indizierten Eigenschaften, die Zeichenfolge Indizes haben. Siehe hier: How to MOQ an Indexed property

+0

wenn es nicht funktioniert dann sollte Session ["id"] null und nicht -1 zurückgeben? – sean

+0

Auch die Antworten auf die Frage, die Sie verknüpft haben, scheinen darauf hinzudeuten, dass es funktioniert? –

1

Es ist, weil Sie den Wert in dem Getter sind Rückkehr, die von Wert übergeben wurde. Jedes Mal, wenn Sie den Getter aufrufen, wird der gleiche Wert zurückgegeben.

Ändern Sie die Rückgabe(), um einen Delegaten zu verwenden, damit er jedes Mal ausgewertet wird. Auf diese Weise erhalten Sie jedes Mal den richtigen Wert :)

Viel einfacher für das Auge als ein SetupGet in einem SetupSet eingebettet.

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

ich gerade lange Zeit versucht, der einfachste Weg, um herauszufinden, es zu tun mit moq verbrachte, ist eine Kopie Vergangenheit meines Codes, die tatsächlich für mich gearbeitet:

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; 

hoffe, das hilft!