.net Mocking Request.Url

.net Mocking Request.Url,.net,asp.net-mvc,nunit,.net,Asp.net Mvc,Nunit,我的控制器使用以下行为会话分配url this.Session["MyUrl"] = Request.Url.ToString(); 在单元测试项目端,我像这样设置控制器 var fakeHttpContext = new Mock<HttpContextBase>(); var controllerContext = new Mock<ControllerContext>(); controllerContext.Setup(t => t.HttpContext

我的控制器使用以下行为会话分配url

this.Session["MyUrl"] = Request.Url.ToString();
在单元测试项目端,我像这样设置控制器

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

但是仍然遇到同样的问题。

您似乎没有正确地模拟ControllerContext。试试这个:

// 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");
...
//排列
var controller=新的HomeController();
var context=newmock();
var session=newmock();
Setup(x=>x.Request.Url).Returns(新Uri(“/Home/Details”,UriKind.Relative));
Setup(x=>x.Session).Returns(Session.Object);
var requestContext=newrequestcontext(context.Object,new RouteData());
controller.ControllerContext=新的ControllerContext(requestContext,controller);
//表演
var实际值=controller.Index();
//断言
VerifySet(x=>x[“MyUrl”]=“/Home/Details”);
...

您在模拟中指定了
/Home/Details
。你希望在控制器中得到什么值?我也希望控制器端有/Home/Details。这不是你得到的吗?是的,这正是我得到的,但我仍然得到附加信息:对象引用未设置为对象异常的实例。我猜Request.Url.OriginalString已填充,所有其他Request.Url字段返回异常。请尝试在模拟中提供绝对Url:
新Uri(“http://example.com/Home/Details)
// 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");
...