C# 基本控制器中的属性在mvc5的单元测试中未触发

C# 基本控制器中的属性在mvc5的单元测试中未触发,c#,asp.net-mvc,unit-testing,C#,Asp.net Mvc,Unit Testing,我知道这不是进行单元测试的正确方法,但我们的基本控制器上有一个ActionFilterAttribute,在单元测试期间它永远不会被触发。我知道我们应该独立测试它,但我们希望将它集成到我们的整体端到端测试中 [ThemeModel] public class BaseController : Controller { public MyModel Context { get; set; } } 从继承的控制器运行测试时,如何集成属性?我理解属性与控制器和mvc框架的一部分没

我知道这不是进行单元测试的正确方法,但我们的基本控制器上有一个ActionFilterAttribute,在单元测试期间它永远不会被触发。我知道我们应该独立测试它,但我们希望将它集成到我们的整体端到端测试中

  [ThemeModel]
public class BaseController : Controller
{
    public MyModel Context { get; set; }    
}
从继承的控制器运行测试时,如何集成属性?我理解属性与控制器和mvc框架的一部分没有联系


谢谢…

您应该单独测试您的过滤器。创建所需的控制器上下文对象和用户“filter.OnActionExecuted(actionExecutedContext.Object);”类似语法。

我认为有两个选项。1是你已经在做的,我不会改变它。2是你问题的答案。我相信两者都有是好的

  • 将控制器和过滤器的单元测试分开。这对于UT是合适的,因为您的控制器和过滤器不应该彼此有硬依赖关系。通过这种方式,您将知道每一个都能独立正常工作(单一责任原则)
  • 创建一组单独的测试,实现
    HttpContextBase
    。我假设您已经有了一个mock
    HttpContextBase
    来进行会话或cookie模拟,所以我将突出显示特定过滤器的主要内容。(如果没有,只需搜索
    HttpContextBase
    和单元测试)

    公共类MockHttpContext:HttpContextBase { 公共MockHttpContext() { MockRequest=newmock(); //……等等。。 var actionExecutingContext=new Mock(); SetupGet(x=>x.HttpContext)。返回(this); var filter=new ThemeModelAttribute(); OnActionExecuting(actionExecutingContext.Object); //如果需要,OnActionExecuted具有类似的设置。 } }


  • 检查属性
    emodel
    是否具有
    AttributeUsage(Inherited=true)

    我需要将其完全集成,否则我需要重写一个旧项目中的所有测试。我将独立测试操作筛选器,但其他测试因此而中断。您必须创建一个使用自主机服务器的集成测试