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

Jef*_*utz 3 asp.net-mvc controller master-pages

做这项工作的机制并不难,但测试它有点奇怪.方案是我想根据基本控制器的用户属性(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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

有什么建议?由于这将在任何地方使用,我想让测试正确.

Mat*_*son 8

您可以通过使用调用OnAuthorization方法的公共方法创建一个继承自基本控制器的类来完成此操作.像这样的东西:

public class TestController : BaseController {
    public TestController(IUserManager userManager) : base(userManager) {
    }

    public void CallOnAuthorization(AuthorizationContext filterContext) {
        OnAuthorization(filterContext);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你测试它是这样的:

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

  • 顺便说一句 - 您可以通过将控制器转换为IAuthorizationFilter并直接调用OnAuthorization()方法来更轻松地测试OnAuthorization()方法本身.(请注意,Controller实现了IAuthorizationFilter,并且此接口委托给您的重写方法.) (2认同)