基本控制器中的属性在mvc5的单元测试中未触发
本文关键字:单元测试 mvc5 属性 控制器 | 更新日期: 2023-09-27 18:17:38
我明白这不是单元测试的正确方式,但我们在基本控制器上有一个ActionFilterAttribute,在单元测试期间从未被触发。我知道我们应该单独测试它,但我们想把它集成到我们的整体测试中。
[ThemeModel]
public class BaseController : Controller
{
public MyModel Context { get; set; }
}
当我们从继承的控制器运行测试时,我如何集成我的属性?我理解属性不是绑定在控制器和mvc框架的一部分。
谢谢…
我认为有两种选择。你已经这么做了,我不会改变的。2是你问题的答案。我相信两者都有好处。
- 将控制器和过滤器的单元测试分开。这对于UT是合适的,因为你的控制器和过滤器不应该彼此有硬依赖。通过这种方式,您将知道每个组件都可以正常工作(单一职责原则)。
-
创建一组单独的测试来实现
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);"类似语法