单元测试CacheManager

时间:2010-06-24 07:08:24

标签: unit-testing testing

我有这个CacheManager类,它保存一个包含各种缓存数据的静态字典。但是,由于这个字典是静态的,它会被其他单元测试中的数据填满。这使我无法进行单元测试,无论Cache在初始化时是否为空,并且违反了单元测试的原则。

如何为此创建适当的单元测试?

代码

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 个答案:

答案 0 :(得分:1)

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

也许更好的解决方案是Singleton Pattern。为此,请删除CacheManager成员上的静态修饰符。然后,您可以在应用中拥有一个静态实例,供其他人使用。因此,在单元测试中,您可以创建一个可以单独测试的类的新实例,但仍然具有所需的功能。

答案 1 :(得分:1)

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

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

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

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

您还可以使用可见性进行游戏,并让您的测试进行清理,而其他代码则不允许这样做。

只要您不并行运行测试,这些黑客就可能会起作用。