完成这项工作的机制并不难,但测试它有点奇怪。方案是我想根据基本控制器的用户属性(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方法来解决问题。我想在我的模拟UserManager中验证是否调用了SetupUserViewData。我没有使用自定义过滤器,因为我没有完整的依赖注入框架(过滤器需要获取IUserManager)。
有什么建议吗?由于这将在任何地方使用,我想让测试正确。
答案 0 :(得分: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
}