asp.net-mvc - 如何使这个 ASP.NET MVC Controller 更易于测试?

标签 asp.net-mvc unit-testing controller

我有一个覆盖 OnActionExecuting 的 Controller 并做这样的事情:

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);
        }
    }
}
Tenant是具有私有(private) setter 的 protected 属性。类本身是一个抽象的基础 Controller ,我的真实 Controller 是从它派生而来的。我在其他 Controller 中的代码看起来很像这样:
if (Tenant == null)
{
   // Do something
}
else
{
   // Do something else
}

如何测试此代码?我需要做的是以某种方式设置租户属性,但我不能,因为:
  • 它是 protected 属性(property),
  • 它有一个私有(private)二传手

  • 更改 Tenant 的可见性“感觉”不对。对我的派生 Controller 进行单元测试的替代方法是什么?

    最佳答案

    这是我的做法:

    在您的测试项目中创建一个从抽象 Controller 继承的具体类,并将租户公开为公共(public)属性。在测试项目中使用 mock 或 dummy 代码并没有错(当然,只是方便测试的 dummy 代码不应该出现在生产项目中)。

    如果这不适合您的情况;您可以使用 Visual Studio 的 Private Accessor Assembly 功能来生成可以访问租户属性的类型。它在 IDE 中可用,or in command-line form .

    关于asp.net-mvc - 如何使这个 ASP.NET MVC Controller 更易于测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3008420/

    相关文章:

    c# - HttpRequest 与 HttpRequestMessage 与 HttpRequestBase

    .net - 具有预编译 View 的助手

    unit-testing - 需要文件的单元测试方法

    javascript - 过滤$范围错误: Unknown provider: $scopeProvider <- $scope <- transformSensorStatusFilter

    javascript - Angularjs指令调用 Controller 函数

    带有子文件夹的 C# ASP.NET MVC Controller

    javascript - jQuery 不附加标题

    c# - 为具有 protected 对象 C# 的代码编写单元测试的好方法是什么(使用 NMock 和 NUnit 框架)

    unit-testing - App Engine 本地单元测试不同实例 [GO]

    ruby-on-rails - 在内存缓存中缓存整个页面,并可选择从中间件或 Controller 提供服务