我知道这不是单元测试的正确方法,但我们的基本控制器上有一个ActionFilterAttribute,在我们的单元测试中永远不会被触发。我知道我们应该独立测试它,但我们希望将它整合到我们的整体测试中。
[ThemeModel]
public class BaseController : Controller
{
public MyModel Context { get; set; }
}
当我们从继承的控制器运行测试时,如何集成我的属性?我理解属性与控制器和mvc框架的一部分无关。
感谢...
答案 0 :(得分:0)
我认为有两种选择。 1是你已经在做的,我不会改变它。 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!
答案 1 :(得分:0)
检查属性ThemeModel
是否有AttributeUsage(Inherited = true)
答案 2 :(得分:-1)
您应该单独测试您的过滤器。创建所需的控制器上下文对象和用户“filter.OnActionExecuted(actionExecutedContext.Object);”像语法一样。