如何使这个ASP.NET MVC控制器更可测试?

Rag*_*esh 5 asp.net-mvc unit-testing controller

我有一个控制器覆盖OnActionExecuting并做这样的事情:

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    base.OnActionExecuting(filterContext);
    string tenantDomain = filterContext.RouteData.Values["tenantDomain"] as string;
    if (!string.IsNullOrWhiteSpace(tenantDomain))
    {
        using (var tx = BeginTransaction())
        {
            this.Tenant = repo.FindOne(t => t.Domain == tenantDomain);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Tenant是一个受保护的财产与私人二传手.该类本身是我的真实控制器派生的抽象基本控制器.我在其他控制器中的代码看起来很像这样:

if (Tenant == null)
{
   // Do something
}
else
{
   // Do something else
}
Run Code Online (Sandbox Code Playgroud)

我该如何测试这段代码?我需要做的是以某种方式设置租户属性,但我不能,因为:

  1. 这是一个受保护的财产,并且
  2. 它有一个私人二传手

改变可见度Tenant并不"感觉"正确.我对派生控制器进行单元测试的替代方案是什么?

Koe*_*oen 0

使用反射?

像这样的东西应该有效(未经测试):

  YourController.GetType()
    .GetProperty("Tenant", BindingFlags.NonPublic | BindingFlags.Instance)
    .SetValue(yourControllerInstance, null, theTestValue);
Run Code Online (Sandbox Code Playgroud)