Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 模拟ParentActionViewContext MVC.Net_Asp.net Mvc_Mocking - Fatal编程技术网

Asp.net mvc 模拟ParentActionViewContext MVC.Net

Asp.net mvc 模拟ParentActionViewContext MVC.Net,asp.net-mvc,mocking,Asp.net Mvc,Mocking,我找不到模拟ControllerContext.ParentActionViewContext的解决方案。 这是我的控制器的代码 [ChildActionOnly] public ViewResult Menu() { string controller = ControllerContext.ParentActionViewContext.RouteData.Values["controller"].ToString(); string action = ControllerContext.

我找不到模拟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,这样我就可以通过我想要进行模拟的任何控制器和操作。 我可以模拟ControllerContext的RoutedData,但不能模拟父控制器的RoutedData。 也许我错过了一些很明显的东西


非常感谢您的帮助。

您没有遗漏任何明显的信息。您已经发现ControllerContext的ParentActionViewContext属性未标记为virtual,因此不可模拟。但是,您可以通过创建一个具有所需值的ViewContext对象,并使用键“ParentActionViewContext”将该对象添加到RouteData.DataTokens字典中来完成所需的操作

您可以在上查看ControllerContext类的源代码和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");
    }
}
[TestFixture]
公共类SomeControllerTests
{
私有部分结果;
私有Mock_mockHttpContext;
私有HttpContextBase_httpContext;
专用路由数据(u RouteData),;
私人路由数据(parentRouteData);;
[测试]
公共无效CanDoSomething()
{
SetupAnonymousUser();
SetupHttpContext();
SetupRouteData();
var controller=new FooController();
controller.ControllerContext=新的ControllerContext(_httpContext,_RoutedData,controller);
_结果=controller.Index()作为PartialViewResult;
var model=_result.ViewData.model作为FooViewModel;
IsNotNull(模型);
Assert.AreEqual(“新”,model.UserStatus);
Assert.AreEqual(“21”,model.PromoId);
}
私有void SetupHttpContext()
{
_mockHttpContext=newmock();
_httpContext=\u mockHttpContext.Object;
}
私有void SetupRouteData()
{
SetupParentRouteData();
var viewContext=newviewcontext{RouteData=\u parentRouteData};
_RoutedData=新RoutedData();
_添加(“控制器”、“foo”);
_添加(“操作”、“索引”);
_routeData.DataTokens[“ParentActionViewContext”]=viewContext;
}
私有void SetupParentRouteData()
{
_ParentRoutedData=新RoutedData();
_parentRouteData.Values.Add(“控制器”、“主”);
_parentRouteData.Values.Add(“操作”、“索引”);
}
}
希望这有帮助


迈克尔·伊巴拉

你没有遗漏任何明显的东西。您已经发现ControllerContext的ParentActionViewContext属性未标记为virtual,因此不可模拟。但是,您可以通过创建一个具有所需值的ViewContext对象,并使用键“ParentActionViewContext”将该对象添加到RouteData.DataTokens字典中来完成所需的操作

您可以在上查看ControllerContext类的源代码和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");
    }
}
[TestFixture]
公共类SomeControllerTests
{
私有部分结果;
私有Mock_mockHttpContext;
私有HttpContextBase_httpContext;
专用路由数据(u RouteData),;
私人路由数据(parentRouteData);;
[测试]
公共无效CanDoSomething()
{
SetupAnonymousUser();
SetupHttpContext();
SetupRouteData();
var controller=new FooController();
controller.ControllerContext=新的ControllerContext(_httpContext,_RoutedData,controller);
_结果=controller.Index()作为PartialViewResult;
var model=_result.ViewData.model作为FooViewModel;
IsNotNull(模型);
Assert.AreEqual(“新”,model.UserStatus);
Assert.AreEqual(“21”,model.PromoId);
}
私有void SetupHttpContext()
{
_mockHttpContext=newmock();
_httpContext=\u mockHttpContext.Object;
}
私有void SetupRouteData()
{
SetupParentRouteData();
var viewContext=newviewcontext{RouteData=\u parentRouteData};
_RoutedData=新RoutedData();
_添加(“控制器”、“foo”);
_添加(“操作”、“索引”);
_routeData.DataTokens[“ParentActionViewContext”]=viewContext;
}
私有void SetupParentRouteData()
{
_ParentRoutedData=新RoutedData();
_parentRouteData.Values.Add(“控制器”、“主”);
_parentRouteData.Values.Add(“操作”、“索引”);
}
}
希望这有帮助


迈克尔·伊巴拉

谢谢。经过一番“挖掘”,我最终得到了类似的结果:谢谢。经过多次“挖掘”,我最终得到了类似的东西: