ASP.NET MVC 初始化控制器并以编程方式调用操作
ASP.NET MVC initialize Controller and call action programatically
我正在构建一个预定作业控制器 - 这些作业将调用 Controller 和 Action 来捕获结果。我宁愿所有这些都发生在后端,而不涉及 http 调用。
这有点像单元测试所发生的事情——例如:
var controller = new TestController();
var result = controller.Index("TestParameter") as ViewResult;
这个例子中的问题是控制器和动作不是动态的,有谁知道如何初始化控制器并使用控制器名称和动作作为字符串参数调用动作?比如-
public ActionResult run(string controllerName, string actionName)
{
var controller = new Controller(controllerName);
var result = controller.action(actionName).("TestParameter") as ViewResult;
return Content(result);
}
使用 ControllerFactory
和 ActionDescriptor
动态执行操作:
public ActionResult Run(string controllerName, string actionName)
{
// get the controller
var ctrlFactory = ControllerBuilder.Current.GetControllerFactory();
var ctrl = ctrlFactory.CreateController(this.Request.RequestContext, controllerName) as Controller;
var ctrlContext = new ControllerContext(this.Request.RequestContext, ctrl);
var ctrlDesc = new ReflectedControllerDescriptor(ctrl.GetType());
// get the action
var actionDesc = ctrlDesc.FindAction(ctrlContext, actionName);
// execute
var result = actionDesc.Execute(ctrlContext, new Dictionary<string, object>
{
{ "parameterName", "TestParameter" }
}) as ActionResult;
// return the other action result as the current action result
return result;
}
见MSDN
我不确定你的真正问题出在哪里——你想测试 controller/action 还是你想测试你的作业的功能?
- 如果你需要测试 controller/action 它将涉及
HttpContext
.
- 如果您需要更好地测试您的工作功能,将其分离到您的服务/存储库层,您可以使用存储库模式进行测试。
我正在构建一个预定作业控制器 - 这些作业将调用 Controller 和 Action 来捕获结果。我宁愿所有这些都发生在后端,而不涉及 http 调用。
这有点像单元测试所发生的事情——例如:
var controller = new TestController();
var result = controller.Index("TestParameter") as ViewResult;
这个例子中的问题是控制器和动作不是动态的,有谁知道如何初始化控制器并使用控制器名称和动作作为字符串参数调用动作?比如-
public ActionResult run(string controllerName, string actionName)
{
var controller = new Controller(controllerName);
var result = controller.action(actionName).("TestParameter") as ViewResult;
return Content(result);
}
使用 ControllerFactory
和 ActionDescriptor
动态执行操作:
public ActionResult Run(string controllerName, string actionName)
{
// get the controller
var ctrlFactory = ControllerBuilder.Current.GetControllerFactory();
var ctrl = ctrlFactory.CreateController(this.Request.RequestContext, controllerName) as Controller;
var ctrlContext = new ControllerContext(this.Request.RequestContext, ctrl);
var ctrlDesc = new ReflectedControllerDescriptor(ctrl.GetType());
// get the action
var actionDesc = ctrlDesc.FindAction(ctrlContext, actionName);
// execute
var result = actionDesc.Execute(ctrlContext, new Dictionary<string, object>
{
{ "parameterName", "TestParameter" }
}) as ActionResult;
// return the other action result as the current action result
return result;
}
见MSDN
我不确定你的真正问题出在哪里——你想测试 controller/action 还是你想测试你的作业的功能?
- 如果你需要测试 controller/action 它将涉及
HttpContext
. - 如果您需要更好地测试您的工作功能,将其分离到您的服务/存储库层,您可以使用存储库模式进行测试。