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

本文关键字:单元测试 mvc5 属性 控制器 | 更新日期: 2023-09-27 18:17:38

我明白这不是单元测试的正确方式,但我们在基本控制器上有一个ActionFilterAttribute,在单元测试期间从未被触发。我知道我们应该单独测试它,但我们想把它集成到我们的整体测试中。

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

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

谢谢…

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

我认为有两种选择。你已经这么做了,我不会改变的。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. } }

HTH !

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

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