2013-08-07 9 views
7

Ich bin neu in MOQ, aber benutze es mit NUnit für Unit-Tests.MOQ - Mocking MVC Controller Response.Cookies.Clear()

Ich habe alle Teile meines Controllers verspottet, mit Ausnahme der folgenden Zeile, die eine 'Objekt nicht auf eine Instanz eines Objekts gesetzt' Fehlermeldung auslöst.

Response.Cookies.Clear(); 

Ich habe folgende Erweiterungsmethode den Controller Kontext zu verspotten, die für alles, was ich accross so weit gekommen funktioniert (sehr viel dank der guten Menschen auf diesem Forum).

Wie Sie oben sehen können, habe ich versucht, das 'Get' der Cookies Sammlung zu verspotten, was nicht hilft.

Auch die tatsächliche Clear() - Methode kann nicht verspottet werden, da es sich nicht um eine virtuelle Methode handelt.

Offensichtlich möchte ich nicht testen, dass die Cookies gelöscht werden, ich möchte nur in der Lage sein, es in Tests zu ignorieren.

Danke,

Greg

+0

Sie diese Frage gesehen haben: http://stackoverflow.com/questions/1228179/mocking-httpcontextbase-with-moq – Halvard

+0

Vielen Dank für die Antwort, aber ich habe die Beispiele in der Verbindung durchgesehen und ich sehe nichts, was ich nicht in dem oben genannten Controller-Kontext getan habe. Wenn ich etwas vermisse, dann zeig mir bitte in die richtige Richtung! – Greg

+0

Sind Sie sicher, dass Sie den gespotteten Kontext und nicht eine HttpContext.Current (zum Beispiel) in diesem Teil des Codes bekommen? Nur eine Vorstellung davon, was falsch sein könnte. – JuhaKangas

Antwort

14

Dies funktioniert für mich, wenn ich cookies.Clear tun()

  var request = new Mock<HttpRequestBase>(MockBehavior.Strict); 
     request.SetupGet(x => x.ApplicationPath).Returns("/"); 
     request.SetupGet(x => x.Url).Returns(new Uri("http://localhost/a", UriKind.Absolute)); 
     request.SetupGet(x => x.ServerVariables).Returns(new System.Collections.Specialized.NameValueCollection()); 

     var response = new Mock<HttpResponseBase>(MockBehavior.Strict); 
     response.Setup(x => x.ApplyAppPathModifier(Moq.It.IsAny<String>())).Returns((String url) => url); 
     // response.SetupGet(x => x.Cookies).Returns(new HttpCookieCollection()); // This also failed to work 

     var context = new Mock<HttpContextBase>(MockBehavior.Strict); 
     context.SetupGet(x => x.Request).Returns(request.Object); 
     context.SetupGet(x => x.Response).Returns(response.Object); 
     context.SetupGet(x => x.Response.Cookies).Returns(new HttpCookieCollection()); // still can't call the Clear() method 
     context.SetupGet(p => p.User.Identity.Name).Returns("blah"); 
     context.SetupGet(p => p.User.Identity.IsAuthenticated).Returns(true); 

     var rc = new RequestContext(context.Object, new RouteData()); 

     controller.ControllerContext = new ControllerContext(rc, controller); 
+0

Danke - die Lösung war, nur die HttpContextBase und nicht den ControllerContext zu verspotten, wie Sie in Ihrem Beispiel gezeigt haben. Auch Dank an Halvard für seine Antwort, die mich in die richtige Richtung weist – Greg

0

(Dies ist nur eine halbe Antwort, aber es war zu groß für das Kommentarfeld ...)

Ihre Verspottung new HttpCookieCollection()richtig ist. Dieser Code funktioniert in Trennung:

var request = new Mock<HttpRequestBase>(MockBehavior.Strict); 
request.SetupGet(x => x.ApplicationPath).Returns("/"); 
request.SetupGet(x => x.Url).Returns(new Uri("http://localhost/a", UriKind.Absolute)); 
request.SetupGet(x => x.ServerVariables).Returns(new System.Collections.Specialized.NameValueCollection()); 

var response = new Mock<HttpResponseBase>(MockBehavior.Strict); 
response.Setup(x => x.ApplyAppPathModifier(Moq.It.IsAny<String>())).Returns((String url) => url); 
// response.SetupGet(x => x.Cookies).Returns(new HttpCookieCollection()); // This also failed to work 

var context = new Mock<HttpContextBase>(MockBehavior.Strict); 
context.SetupGet(x => x.Request).Returns(request.Object); 
context.SetupGet(x => x.Response).Returns(response.Object); 
context.SetupGet(x => x.Response.Cookies).Returns(new HttpCookieCollection()); // still can't call the Clear() method 


// Here clearing the cookies works just fine: 
var instance = context.Object; 
instance.Response.Cookies.Clear(); 

Also der Fehler ist nicht da, sondern woanders. Was passiert, wenn Sie die Zeile mit Response.Cookies.Clear() aus Ihrem Code auskommentieren? Wird dann alles andere richtig verspottet? Wenn Sie den Test debuggen, können Sie sehen, dass der Rest des Mocks wie erwartet ist? Ich wäre überrascht, wenn es wäre (aber ich war vorher überrascht ...).