在MVC中模拟RouteTable.Routes.GetVirtualPath

时间:2009-04-27 09:46:26

标签: asp.net-mvc rhino-mocks

我有一个调用控制器,调用

的方法
RouteTable.Routes.GetVirtualPath(this.viewContext.RequestContext, valueDictionary)

我正在尝试使用Rhino模拟测试此方法,我不确定如何模拟GetVirtualPath以返回除null之外的路由。我在模拟RequestContext,但我不确定哪些方法/属性需要存根。

通过适当地对mockRequestContext进行存根,GetVirtualPath应该返回一个非空路径,如果是,那么为什么需要这个路径才能工作呢?

任何建议都非常感谢。

2 个答案:

答案 0 :(得分:1)

不确定我是否理解你的问题,但它看起来像这样:

IRouteTable routeTableMock = RhinoMocks.CreateMock<IRouteTable>();

// assuming that IRouteTable.Routes is of type IRoutes.
IRoutes routes = RhinoMocks.CreateMock<IRoutes>();

// return the routes with the mock
routeTableMock.Stub(x => x.Routes).Return(routes);

// setup the mock for GetVirtualPath
routes.Stub(
  x => x.GetVirtualPath(
    Arg<RequestContext>.Is.Anything, 
    Arg<IDictionary>.Is.Anything)
  .Return(/* whatever */);

如果这不是您想要的,您必须详细说明您的课程以及您想要测试的内容。

答案 1 :(得分:1)

如果您不需要完整的虚拟路径,只需要它生成的URL,您可以使用:

new UrlHelper(ControllerContext.RequestContext).RouteUrl(routeValueDictionary)

...并模拟出ControllerContext:

var mockHttpContext = new Mock<HttpContextBase>();

var controllerContext
    = new ControllerContext(
        mockHttpContext.Object,
        new RouteData(), 
        new Mock<ControllerBase>().Object);

var myController = new MyController { ControllerContext = controllerContext };

我遇到了这个问题,但这似乎已经解决了。