2014-11-24 4 views
1

Я использую MVC5 для создания проекта на основе культуры. Я создаю несколько тестовых примеров для своего приложения, используя MOQ, но я не могу найти свой Маршрут в этом. Я использую класс с именем MockHttpContext, чтобы получить свой httpcontext, как показано ниже.Не удалось получить RouteData в проекте MVC

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

Нет, мы не можем этого сделать, потому что это базовая функциональность, которую я использую в конце контроллера и в логическом конце, мы не можем издеваться над этим в моем классе утилиты, если эта вещь используется в мой тестовый проект тогда определенно я издевался над ним ... так что в любом случае спасибо за ваш ответ. Я решил эту проблему, не используя DLL MOQ, мы создаем свой собственный поддельный Httpcontext, запрос, ответ и сервер, который хорош, и мои тестовые примеры сейчас работая отлично с использованием MOQ. –