c# - 我怎样才能测试一个类(class)?

标签 c# oop

<分区>

我有这样一个类

public class BonusImageHandler
{   private static IStorageProvider _storageProvider;
    private static Type storageProviderType;
    private static readonly object _lock = new object();
    private static IStorageProvider StorageProvider
    {
        get
        {
            lock (_lock)
            {
                if (_storageProvider == null)
                {
                    lock (_lock)
                    {
                        _storageProvider = (IStorageProvider)Activator.CreateInstance(storageProviderType);
                    }
                }
            }
            return _storageProvider;
        }
    }

    public BonusImageHandler(string providerTypeName)
    {
        storageProviderType = Type.GetType(providerTypeName);
    }

   public void ProcessRequest(HttpContext context)
   {
        //do some thing here
    }

    private static string ParseInputs(string baseUrl, string imageType)
    {
      //do other things
     }
}

构造函数不是静态的,因为它采用字符串作为参数,并且属性 private static IStorageProvider StorageProvider 是静态的。组长告诉我这样不行,为什么??我该如何测试??如何将 httpContext 传递给 ProcessRequest 函数。 对于这个愚蠢的问题,我很抱歉,但我还是个初学者。

最佳答案

这很糟糕,因为 instance 构造函数分配了 static 字段;考虑:

var x = new BonusImageHandler("foo");
var y = new BonusImageHandler("bar");

现在...什么是static storageProviderType,为什么它有意义? x 使用什么处理程序? (提示:它不是 "foo")。

现在考虑多个调用者,可能在不同的线程上,看似随机地调用它。

坦率地说,看起来应该更像是:

public static void InitProvider(string providerTypeName) {...}

但是当你这样做的时候,你就会开始思考也许它应该是:

public static void InitProvider(Type providerType) {...}

或者更清楚:

public static void InitProvider(IStorageProvider provider) {...}

或者:只需将其设为实例字段,这样您就可以将提供者分别传递(可能通过 IoC/DI 工具)到每个实例中,即

private readonly IStorageProvider provider;
public BonusImageHandler(IStorageProvider provider) {this.provider = provider;}

关于c# - 我怎样才能测试一个类(class)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11796017/

相关文章:

c# - 如何在 ASP.NET MVC 2.0 中对多个属性进行自定义验证?

java - 库存管理JAVA(检查项目是否已存在)

java - 阻止用户调用父函数

java - 链接到子类中的另一个构造函数

c# - AjaxControlToolkit.MaskedEditExtender 错误

c# - 给定单例缓存模式的缺点

c# - 在 C# .NET 项目中启动时如何等待提升的 PowerShell 进程退出?

php - 在 PHP 中为 MVC Controller 合并 INSERT Mysql 查询

JavaScript 局部变量。如何在圆圈中引用

c# - 定义环境变量