2010-07-16 3 views
1

ControllerContext.ParentActionViewContext를 모의 해답을 찾을 수 없습니다. 여기에 내가 내 시뮬레이션을 수행 할 어떤 컨트롤러와 액션 통과 할 수 있도록 내가 달성하고자하는 시험의 모의 ParentActionViewContext 내 컨트롤러모의 ParentActionViewContext MVC.Net


[ChildActionOnly] 
public ViewResult Menu() 
{ 
string controller = ControllerContext.ParentActionViewContext.RouteData.Values["controller"].ToString(); 
string action = ControllerContext.ParentActionViewContext.RouteData.Values["action"].ToString(); 
List menuItems = new List(); 

...code to populate my list... 

return View(menuItems); 
} 

의 코드입니다. ControllerContext의 RouteData를 조롱 할 수는 있지만 상위 컨트롤러 중 하나를 가짜로 만들 수는 없습니다. 어쩌면 내가 obviuos를 놓치고 있습니다.

도움을 주시면 대단히 감사하겠습니다.

답변

5

눈에 띄는 것이 없습니다. ControllerContext의 ParentActionViewContext 속성이 가상으로 표시되지 않으므로 un-mockable이라는 것을 이미 발견했습니다. 그러나 원하는 값으로 ViewContext 객체를 만들고 "ParentActionViewContext"키를 사용하여 해당 객체를 RouteData.DataTokens 사전에 추가하여 원하는 것을 얻을 수 있습니다.

ControllerContext 클래스의 소스 코드와 http://bit.ly/ku8vR4의 ParentActionViewContext 속성 구현을 볼 수 있습니다.

여기 내 시험에서이 구현 방법은 다음과 같습니다이 도움이

[TestFixture] 
public class SomeControllerTests 
{ 
    private PartialViewResult _result; 
    private Mock<HttpContextBase> _mockHttpContext; 
    private HttpContextBase _httpContext; 
    private RouteData _routeData; 
    private RouteData _parentRouteData; 


    [Test] 
    public void CanDoSomething() 
    { 
     SetupAnonymousUser(); 
     SetupHttpContext(); 
     SetupRouteData(); 
     var controller = new FooController(); 

     controller.ControllerContext = new ControllerContext(_httpContext, _routeData, controller); 

     _result = controller.Index() as PartialViewResult; 

     var model = _result.ViewData.Model as FooViewModel; 

     Assert.IsNotNull(model); 
     Assert.AreEqual("New", model.UserStatus); 
     Assert.AreEqual("21", model.PromoId); 
    } 

    private void SetupHttpContext() 
    { 
     _mockHttpContext = new Mock<HttpContextBase>(); 
     _httpContext = _mockHttpContext.Object; 
    } 

    private void SetupRouteData() 
    { 
     SetupParentRouteData(); 
     var viewContext = new ViewContext {RouteData = _parentRouteData}; 

     _routeData = new RouteData(); 
     _routeData.Values.Add("controller", "foo"); 
     _routeData.Values.Add("action", "index"); 
     _routeData.DataTokens["ParentActionViewContext"] = viewContext; 
    } 

    private void SetupParentRouteData() 
    { 
     _parentRouteData = new RouteData(); 
     _parentRouteData.Values.Add("controller", "home"); 
     _parentRouteData.Values.Add("action", "index"); 
    } 
} 

희망!

마이클 Ibarra

+0

감사합니다. 나는 많은 "파기"후에 유사한 somthing와 끝났다 :) – Iridio