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

时间:2015-10-13 11:02:22

标签: c# asp.net-mvc unit-testing

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

  [ThemeModel]
public class BaseController : Controller
{
    public MyModel Context { get; set; }    
}

当我们从继承的控制器运行测试时,如何集成我的属性?我理解属性与控制器和mvc框架的一部分无关。

感谢...

3 个答案:

答案 0 :(得分:0)

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

  1. 保持控制器和过滤器的单元测试分开。这适用于UT,因为您的控制器和过滤器不应该彼此具有硬依赖性。通过这种方式,您将了解每种方法都可以自行运行(单一责任原则)。
  2. 创建一组实现HttpContextBase的单独测试。我假设你已经有一个模拟HttpContextBase来做会话或cookie模拟,所以我只是强调你的特定过滤器的主要内容。 (如果不这样做,只需搜索HttpContextBase和单元测试)。

    public class MockHttpContext : HttpContextBase { public MockHttpContext() { MockRequest = new Mock<HttpRequestBase>(); // .. etc .. var actionExecutingContext = new Mock<ActionExecutingContext>(); actionExecutingContext.SetupGet(x => x.HttpContext).Returns(this); var filter = new ThemeModelAttribute(); filter.OnActionExecuting(actionExecutingContext.Object); // OnActionExecuted has similar setup if needed. } }

  3. HTH!

答案 1 :(得分:0)

检查属性ThemeModel是否有AttributeUsage(Inherited = true)

答案 2 :(得分:-1)

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