我怎样才能测试课程?

时间:2012-08-03 12:46:07

标签: 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函数。 对于这个愚蠢的问题我很抱歉,但我还是初学者。

1 个答案:

答案 0 :(得分:4)

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

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

现在......什么是静态 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;}