C# 为什么';在MVC中进行单元测试时,是否对自定义ActionMethodSelectorAttribute进行评估?
如果我使用自定义ActionMethodSelectorAttribute装饰控制器动作,则该属性将在标准使用期间进行计算,并且我可以在调试会话期间打断该属性的主体。但是,在单元测试期间调用控制器操作时,不会评估/评估该属性,也不会在调试期间中断该属性。为什么会这样?无论是正常运行还是在测试中,行为都应该相同吗C# 为什么';在MVC中进行单元测试时,是否对自定义ActionMethodSelectorAttribute进行评估?,c#,asp.net-mvc,C#,Asp.net Mvc,如果我使用自定义ActionMethodSelectorAttribute装饰控制器动作,则该属性将在标准使用期间进行计算,并且我可以在调试会话期间打断该属性的主体。但是,在单元测试期间调用控制器操作时,不会评估/评估该属性,也不会在调试期间中断该属性。为什么会这样?无论是正常运行还是在测试中,行为都应该相同吗 谢谢MVC框架的某些部分将通过在控制器上反射并调用所需的方法来调用该属性。如果您的测试看起来像: Controller testController = new YourControll
谢谢MVC框架的某些部分将通过在控制器上反射并调用所需的方法来调用该属性。如果您的测试看起来像:
Controller testController = new YourController(dependecies);
ActionResult result = testController.Action();
//assert on result
然后将不会处理属性,因此不会命中断点。是ASP.NET MVC框架负责运行操作筛选器。在内部,它使用反射来检查控制器和操作方法,如果该方法或控制器被任何ActionFilter属性修饰,它将在请求生命周期中的适当点运行这些过滤器 对于单元测试,您需要单独对您的操作过滤器进行单元测试—将模拟的ActionExecutedContext(或您正在筛选的任何上下文)直接注入到filter方法中,并验证route/result/viewdata是否根据需要进行了修改 如果您真的致力于100%的测试覆盖率,那么您还可以实现单元测试,使用反射来验证您是否具有所需的操作过滤器属性来装饰适当的控制器方法 不要担心测试来确保操作过滤器被启动——这些测试是ASP.NET MVC源代码的一部分,上次我查看时,它们都是绿色的