嘲笑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
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>();
}