Макет ParentActionViewContext MVC.Net - PullRequest
1 голос
/ 16 июля 2010

Я не могу найти решение для насмешки ControllerContext.ParentActionViewContext.вот код моего контроллера


[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);
}

Что я хочу сделать, это макет ParentActionViewContext в тесте, чтобы я мог передать любой контроллер и действие, которое я хочу выполнить в своих имитациях.Я могу издеваться над RouteData ControllerContext, но я не могу подделать один из родительского контроллера.Может быть, я что-то упускаю obviuos.

Любая помощь с благодарностью.

1 Ответ

5 голосов
/ 20 мая 2011

Вы не упускаете ничего очевидного. Вы уже обнаружили, что свойство 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");
    }
}

Надеюсь, это поможет!

Майкл Ибарра

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...