如何模拟ControllerContext.IsChildAction属性?

时间:2015-07-29 14:38:23

标签: c# asp.net-mvc nunit moq

我在控制器中有一个ASP.Net MVC方法:

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

    return PartialView();
}

当我在nunit测试中运行此方法时,我有错误的IsChildProperty。如何将此属性模拟为true以测试方法的其他部分?这个属性是readonly:/

2 个答案:

答案 0 :(得分:2)

你需要模拟你正在测试的控制器的ControllerContext,IsChildAction属性只是带有getter的虚拟,你可以设置它返回true,mock会生成一个派生类,它将覆盖属性以返回你拥有的属性设置。

例如,如果您使用的是Moq lib:

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

YourController controller = new YourController(); 
controller.ControllerContext = mockControllerContext.Object; 

更多信息:

https://coderwall.com/p/abwnkq/common-asp-net-mvc-controller-mocking-scenarios

答案 1 :(得分:1)

第1步) 虽然ControllerContext的IsChildAction是只读的,但 fortunatelly ControllerBase的ControllerContext属性不是只读的,因此您可以在测试目标控制器上自由设置它。

第2步) Fortunatelly IsChildAction getter是虚拟。这样就可以模拟它,甚至可以不用嘲笑创建一个后代并覆盖这个getter来返回你的选择。