代码之家  ›  专栏  ›  技术社区  ›  Jeff Putz

我可以在ASP.NET MVC控制器基类中测试对OnAuthorization的重写吗?

  •  3
  • Jeff Putz  · 技术社区  · 16 年前

    做这项工作的机制并不难,但是测试它有点奇怪。场景是,我希望基于基本控制器(iprincipal对象)的用户属性将一些基本用户数据转储到视图数据中,以便主页面始终具有这些数据。我需要访问我的iusermanager(一个服务类),该类由控制器工厂中的自定义DI提供。模拟用户对测试没有问题。但是,对于基本控制器中的每个操作,实现这一点的最简单方法是通过重写OnAuthorization方法来实现。然后,基类如下所示:

    public abstract class BaseController : Controller
    {
        public BaseController(IUserManager userManager)
        {
            UserManager = userManager;
        }
    
        public IUserManager UserManager { get; private set; }
    
        protected override void OnAuthorization(AuthorizationContext filterContext)
        {
            base.OnAuthorization(filterContext);
            UserManager.SetupUserViewData(User, ViewData);
        }
    }
    

    问题是,我无法在测试中找到让OnAuth方法触发的方法。我想在我的模拟用户管理器中验证是否调用了SetupUserViewData。我没有使用自定义过滤器,因为我没有一个完整的依赖注入框架(过滤器需要一个IUserManager)。

    有什么建议吗?因为这将在任何地方使用,所以我想正确地进行测试。

    1 回复  |  直到 16 年前
        1
  •  8
  •   Mattias Jakobsson    16 年前

    您可以通过使用调用OnAuthorization方法的公共方法创建从基控制器继承的类来实现这一点。像这样:

    public class TestController : BaseController {
        public TestController(IUserManager userManager) : base(userManager) {
        }
    
        public void CallOnAuthorization(AuthorizationContext filterContext) {
            OnAuthorization(filterContext);
        }
    }
    

    然后像这样测试它:

    [Test]
    public void TestMethod() {
        var userManager = //Mock usermanager;
        var filterContext = //Mock AuthorizationContext;
        var controller = new TestController(userManager);
        controller.CallOnAuthorization(filterContext);
        //Assert here
    }