2017-01-27 6 views
0

Mein Controller folgende Zeile mit URL zur SitzungssteuerungMocking Request.Url

this.Session["MyUrl"] = Request.Url.ToString(); 

auf Unit-Test-Projektseite I-Setup wie diese auf dieser letzte Zeile

var fakeHttpContext = new Mock<HttpContextBase>(); 
var controllerContext = new Mock<ControllerContext>(); 
controllerContext.Setup(t => t.HttpContext).Returns(fakeHttpContext.Object); 
this.controller.ControllerContext = controllerContext.Object;    
controllerContext.SetupGet(x => x.HttpContext.Request.Url).Returns(new Uri("/Home/Details", UriKind.Relative)); 

zuweisen Ich versuche, Setup Request.Url, um den Wert, den ich auf der Controller-Seite erwarten, zu übergeben.

Alles, was ich als Ergebnis auf Request.Url bekomme, ist '/Home/Details'.

Muss ich ganze Url Objekt innerhalb Anfrage verspotten, um dies zu arbeiten?

Update: ich ein Setup-Session-Objekt in Httpcontext Setup

fakeHttpContext.Setup(x => x.Session["MyUrl"]).Returns("/Home/Details"); 

aber immer noch das gleiche Problem auftritt.

+0

Sie haben '/ Home/Details' in Ihrem Mock angegeben. Welchen Wert erwarten Sie in der Steuerung? –

+0

Ich erwarte auch/Home/Details auf der Controller-Seite. – user1765862

+0

Nicht was du bekommst? –

Antwort

2

Sie scheinen den ControllerContext nicht richtig zu verspotten. Versuchen Sie folgendes:

// arrange 
var controller = new HomeController(); 
var context = new Mock<HttpContextBase>(); 
var session = new Mock<HttpSessionStateBase>(); 
context.Setup(x => x.Request.Url).Returns(new Uri("/Home/Details", UriKind.Relative)); 
context.Setup(x => x.Session).Returns(session.Object); 
var requestContext = new RequestContext(context.Object, new RouteData()); 
controller.ControllerContext = new ControllerContext(requestContext, controller); 

// act 
var actual = controller.Index(); 

// assert 
session.VerifySet(x => x["MyUrl"] = "/Home/Details"); 
...