代码之家  ›  专栏  ›  技术社区  ›  koenmetsu

单元测试缓存管理器

  •  5
  • koenmetsu  · 技术社区  · 14 年前

    我有一个cachemanager类,它使用各种缓存数据保存静态字典。然而,当这个字典是静态的时,它会被来自其他单元测试的数据填满。这使我无法进行单元测试,不管cachemanager在init上是否为空,并且违背了单元测试的原则。

    有什么想法如何为这个创建一个适当的单元测试吗?

    代码

    public class CacheManager
    {
       private static readonly Dictionary<ICacheKey, ListCacheItem> cacheEntries =
           new Dictionary<ICacheKey, ListCacheItem>();
    
       public static Dictionary<ICacheKey, ListCacheItem> CacheEntries
       {
           get
           {
               lock (cacheEntries)
               {
                   return cacheEntries;
               }
           }
       }
    
    2 回复  |  直到 13 年前
        1
  •  1
  •   dyross    14 年前

    一般来说,从测试的角度来看,这不是一个好主意。通过使成员 CacheManager 静态的,您将永远无法以这样的方式隔离它,使其适合于单元测试。

    也许更好的解决方案是 Singleton Pattern . 要执行此操作,请去掉上的静态修饰符 卡切梅纳 的成员。然后,您的应用程序中可以有一个其他人使用的静态实例。因此,在单元测试中,您可以创建一个新的类实例,该实例可以单独测试,但仍然具有所需的功能。

        2
  •  1
  •   Sandor Murakozi    14 年前

    简短回答:你做不好。单元测试和静态不能很好地结合在一起,您(几乎)总是会遇到像您提到的那样的问题。

    更长的答案:最好的解决方案是重构代码。即使您需要单例行为,您也有几个选项(例如依赖注入)。大卫的建议当然也是一个选项,至少可以让你测试你的缓存,但是当你想测试系统的其余部分时,你可能仍然有问题。

    如果出于某种原因,你想坚持你目前的设计,你仍然可以有一些(不必要的好的)解决办法。一些例子:

    最简单的方法可能是添加“cleancache”方法。在某些情况下,它甚至可能对系统的其余部分有用,并且每个测试也可以作为第一步(在“设置/预测试或类似方法”中)。

    您还可以使用可见性,让您的测试执行其他代码不允许的清理。

    只要您不并行运行测试,这些黑客程序就可能工作。