Вы не упускаете ничего очевидного. Вы уже обнаружили, что свойство ParentActionViewContext элемента ControllerContext не помечено как виртуальное и, следовательно, не может быть смоделировано. Однако вы можете достичь желаемого, создав объект ViewContext со значениями, которые вы хотите, добавив этот объект в словарь RouteData.DataTokens с помощью ключа «ParentActionViewContext».
Вы можете просмотреть исходный код класса ControllerContext и реализацию свойства ParentActionViewContext по адресу http://bit.ly/ku8vR4.
Вот как я реализовал это в своем тесте:
[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");
}
}
Надеюсь, это поможет!
Майкл Ибарра