嘲笑ControllerContext.IsChildAction在ParentActionViewContext中抛出

本文关键字:ParentActionViewContext ControllerContext IsChildAction 嘲笑 | 更新日期: 2023-09-27 18:05:33

我有一个ASP。控制器中的。MVC方法:

public ActionResult Update()
{
    if(!ControllerContext.IsChildAction)
    {
        return RedirectToAction("Details","Project");
    }
    return PartialView();
}

我模拟IsChildAction,所以它返回true。

var mockControllerContext = new Mock<ControllerContext>(); 
mockControllerContext.SetupGet(m => m.IsChildAction).Returns(true);
YourController controller = new YourController(); 
controller.ControllerContext = mockControllerContext.Object;

但是这个变化在某种程度上反映了asp.net机制,现在需要属性ControllerContext。ParentActionViewContext不为空。所以当在测试中执行return语句时它抛出空引用因为这个属性是空的。我不能嘲笑它,因为它不是虚拟的:/

任何想法如何注入在控制器上下文值为它?

嘲笑ControllerContext.IsChildAction在ParentActionViewContext中抛出

您可能必须在ControllerContext moq中使用CallBase = true:

var mockControllerContext = new Mock<ControllerContext> { CallBase = true, };

这样你仍然可以设置IsChildAction属性,但是CallBase等于true, ControllerContext的模拟使用ControllerContext的真实实现,所以ParentActionViewContext应该在那里。

编辑:

在对mvc源代码进行了简短的检查后,我猜测Null-Reference异常可能是由来自:this.RouteData.DataTokens["ParentActionViewContext"] as ViewContext;ParentActionViewContext引起的。

所以尝试将fakeRouteData.DataTokens["ParentActionViewContext"] = fakeViewContext;添加到您的测试中。

这个为我工作:

[TestMethod]
public void MyTestMethod()
{
    // Arrange
    RouteData fakeRouteData = new RouteData();
    ViewContext fakeViewContext = new ViewContext();
    fakeRouteData.DataTokens["ParentActionViewContext"] = fakeViewContext;
    Mock<HttpContextBase>  httpContextStub = new Mock<HttpContextBase>();
    RequestContext requestContext = new RequestContext(httpContextStub.Object, fakeRouteData);
    HomeController controller = new HomeController();
    var mockControllerContext = new Mock<ControllerContext>(requestContext, controller) { CallBase = true, };
    mockControllerContext.SetupGet(m => m.IsChildAction).Returns(true);
    controller.ControllerContext = mockControllerContext.Object;
    // Act
    var res = controller.Update();
    // Assert
    // TODO ...
}

与System.Web测试。Mvc, Version = 5.2.3.0。

首先从包管理器控制台安装这个包

安装Xania.AspNet.Simulator -Version 1.3.9

这两个测试针对Update方法的每个执行路径。

[Test]
public void ChildActionNotInvokedAsChildAction()
{
    var action = new TestController()
        .Action(c => c.Update());
    action.GetActionResult().Should().BeOfType<RedirectToRouteResult>();
}
[Test]
public void ChildActionInvokedAsChildAction()
{
    var action = new TestController()
        .ChildAction(c => c.Update());
    action.GetActionResult().Should().BeOfType<PartialViewResult>();
}
相关文章:
  • 没有找到相关文章