如何模拟ControllerContext.IsChildAction属性?

How to mock ControllerContext.IsChildAction property?

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

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

    return PartialView();
}

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

您需要模拟您正在测试的控制器的 ControllerContext,IsChildAction 属性 仅在 getter 下是虚拟的,您可以将其设置为 return true,模拟将生成一个派生的 class,它将覆盖 属性 到 return 您所设置的内容。

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

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) 虽然ControllerContext的IsChildAction是只读的,幸运的是 ControllerBase的ControllerContext属性不是只读的,所以你可以在你的测试目标控制器上自由设置它。

步骤 2) 幸好 IsChildAction getter 是虚拟的。这开启了模拟它的可能性,或者甚至在没有模拟的情况下创建一个后代并根据您的选择将此 getter 覆盖为 return。