【发布时间】:2021-09-13 16:43:15
【问题描述】:
我为我的控制器方法编写了单元测试代码,它涵盖了所有块。
这是有问题的相关行。
[TestMethod()]
public void ManageAreasTest()
{
//bunch of code
var result = new AdminController().ManageAreas();
//more code
}
这 ManageAreas() 行几乎是其他单元测试代码逻辑中唯一会改变的东西(例如,ManageSubAreas() 控制器方法,它与 ManageAreas() 具有完全相同的逻辑,只是返回不同的视图)。
所以,为了避免单元测试代码的复制粘贴,只是改变方法调用,我想动态传递控制器方法名并执行它。
为此,我创建了一个新类
public partial class ExecuteControllerMethodTest
{
public string ActionName { get; set; }
public string ControllerName { get; set; }
}
我知道的唯一方法是 RedirectToAction,所以我在我的单元测试类中创建了一个方法
private RedirectToRouteResult ExecuteControllerMethod(ExecuteControllerMethodTest model)
{
return RedirectToAction(model.ActionName, model.ControllerName);
}
在我的单元测试代码中,我像这样更新了它
[TestMethod()]
public void ManageAreasTest()
{
ExecuteControllerMethodTest model = new ExecuteControllerMethodTest();
model.ControllerName = "Admin";
model.ActionName = "ManageAreas";
//bunch of code
var result = ExecuteControllerMethod(model);
//more code
}
但是,当我调试代码时,我在 ManageAreas() 中的断点没有被命中。
总的来说,这是我的问题:
-
我是否使用正确的方法来实现该目标?
-
如果是这样,我做错了什么?
非常感谢您!
编辑:
我的计划是创建一个额外的方法,该方法将包含来自 ManageAreasTest() 的几乎所有代码。此时 UT 方法唯一要做的就是初始化类变量并运行方法本身。
[TestMethod()]
public void ManageAreasTest()
{
ExecuteControllerMethodTest model = new ExecuteControllerMethodTest();
model.ControllerName = "Admin";
model.ActionName = "ManageAreas";
RunAdminControllerUnitTestForMethod(model);
}
private void RunAdminControllerUnitTestForMethod(model)
{
//Pretty much the entire code from ManageAreasTest()
//Just instead of var result = new AdminController().ManageAreas();
//It will be
var result = ExecuteControllerMethod(model);
}
我认为更好的问题是:除了调用控制器方法之外,还有哪些其他方法
var result = new AdminController().ManageAreas();
什么时候方法名是动态的? 比如,如果我想传递“ManageAreas”,它会像 new AdminController().ManageAreas() 一样执行这个方法。
【问题讨论】:
标签: c# asp.net-mvc unit-testing