2010-02-17 59 views
3

使这项工作的机制并不难,但测试它有点奇怪。该方案是我想基于基本控制器(IPrincipal对象)的User属性将一些基本用户数据转储到视图数据中,以便母版页始终拥有它。我需要访问我的IUserManager(服务类),它由控制器工厂中的自定义DI提供。嘲笑用户对测试没有任何问题。但是,为基本控制器中的每个操作实现此目的的最简单方法是通过重写OnAuthorization方法来完成此操作。然后,基类看起来是这样的:我可以在ASP.NET MVC控制器基类中测试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方法火地身影。我想在我的模拟UserManager中验证SetupUserViewData被调用。我没有使用自定义过滤器,因为我没有完整的依赖注入框架(过滤器需要获得IUserManager)。

有什么建议吗?因为这将在任何地方使用,所以我想要测试的权利。

回答

8

您可以通过创建一个继承自基本控制器的类并调用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 
} 
+0

你以为我测试了正确的事情呢?我想我可能在这里表现得太学术了,但感觉很奇怪,因为我假定控制器在运行时会正确执行,并且如果有授权用户,则调用该方法。 – 2010-02-17 08:04:20

+0

好吧,如果你要测试我认为你想要的,你会测试框架,而不是你的代码。你必须假设你正在使用的框架已经过适当的测试。 – 2010-02-17 08:10:14

+2

顺便说一句 - 您可以更轻松地测试OnAuthorization()方法本身,方法是将您的控制器转换为IAuthorizationFilter并直接调用OnAuthorization()方法。 (请注意,Controller实现IAuthorizationFilter,并且此接口委托给您的重写方法。) – Levi 2010-02-17 09:03:33

相关问题