如何模拟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。
我在控制器中有一个 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。