2014-11-24 65 views
1

我正在使用MVC5在文化基础上创建项目。我正在使用起订量为我的应用程序创建一些测试用例,但我无法在此找到我的路线。我正在使用名为MockHttpContext的类来获取我的httpcontext,如下所示。无法在MVC项目中检索RouteData

public static HttpContextBase MockHttpContext() 
{      
    var context = new Mock<HttpContextBase>(); 
    var request = new Mock<HttpRequestBase>(); 
    var response = new Mock<HttpResponseBase>(); 
    var session = new Mock<HttpSessionStateBase>(); 
    var server = new Mock<HttpServerUtilityBase>(); 
    var user = new Mock<IPrincipal>(); 
    var identity = new Mock<IIdentity>(); 
    var urlHelper = new Mock<UrlHelper>(); 

    var routes = new RouteCollection(); 
    RouteTable.Routes.Clear(); 
    var areaRegistration = new AdminAreaRegistration(); 
    var areaRegistrationContext = new AreaRegistrationContext(
    areaRegistration.AreaName, RouteTable.Routes); 
    areaRegistration.RegisterArea(areaRegistrationContext);   

    RouteConfig.RegisterRoutes(RouteTable.Routes); 
    var requestContext = new Mock<RequestContext>(); 
    requestContext.Setup(x => x.HttpContext).Returns(context.Object); 
    context.Setup(ctx => ctx.Request).Returns(request.Object); 
    context.Setup(ctx => ctx.Response).Returns(response.Object); 
    context.Setup(ctx => ctx.Session).Returns(session.Object); 
    context.Setup(ctx => ctx.Server).Returns(server.Object); 
    context.Setup(ctx => ctx.User).Returns(user.Object); 
    user.Setup(ctx => ctx.Identity).Returns(identity.Object); 
    identity.Setup(id => id.IsAuthenticated).Returns(true); 
    identity.Setup(id => id.Name).Returns("test"); 
    request.Setup(req => req.Url).Returns(new Uri("http://localhost/")); 
    request.Setup(req => req.RequestContext).Returns(requestContext.Object); 
    requestContext.Setup(x => x.RouteData).Returns(new RouteData()); 
    request.SetupGet(req => req.Headers).Returns(new NameValueCollection()); 
    return context.Object; 
} 

    //this method is being called in my test class like.. 

[TestMethod] 
public void Index() 
{ 
    try 
    { 
     var controller = new HomeController(); 
     var httpContext = MvcMockHelpers.MockHttpContext(); 
     var routeData = RouteTable.Routes.GetRouteData(httpContext); 
     controller.SetMockControllerContext(
     httpContext, routeData, RouteTable.Routes); 
     ViewResult result = controller.Index() as ViewResult; 

     Assert.AreEqual(result, ErrorResources.Error); 

    } 
    catch(Exception ex) 
    { 
     throw ex; 
    } 
    } 

但问题是这样的:每当我想在我的工具 类来获得文化来迎接我的情况下,使用下面的线。

var context = new HttpContextWrapper(System.Web.HttpContext.Current); 
var routeData = RouteTable.Routes.GetRouteData(context);   
var code = routeData.Values[Constants.CULTURE]; 

这我返回空航线的情况下,意味着路由和RouteHandler是零和键/值也为0,所以我试图检查此行。

requestContext.Setup(x => x.RouteData).Returns(new RouteData()); 

在这一行,new RouteData()为空,即使我之前已经注册了。那么在这种情况下,我怎么能得到我的RouteData()

回答

0

问题是微不足道的,因为你没有使用嘲讽的HttpContextBase。 用以下代码替换第二个代码块。

var context = MockHttpContext(); 
var routeData = RouteTable.Routes.GetRouteData(context);   
var code = routeData.Values[Constants.CULTURE]; 
+0

不,我们不能这样做,因为这是我用我的控制器端与逻辑端的基本功能,我们不能在我的实用工具类嘲笑这一点,如果这件事情正在被使用我的测试项目,然后肯定我嘲笑它...所以无论如何感谢您的答复..我已经解决了这个问题,而不使用MOQ dll,我们创建自己的假Httpcontext,请求,响应和服务器是好的,我的测试用例现在使用最小起订量可以很好地工作。 – 2014-12-05 10:55:34