我在控制器中有一个ASP.Net MVC方法:
public ActionResult Update()
{
if(!ControllerContext.IsChildAction)
{
return RedirectToAction("Details","Project");
}
return PartialView();
}
当我在nunit测试中运行此方法时,我有错误的IsChildProperty。如何将此属性模拟为true以测试方法的其他部分?这个属性是readonly:/
答案 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来返回你的选择。