我有这个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;
}
}
}
答案 0 :(得分:1)
一般来说,从测试角度来看,这不是一个好主意。通过使CacheManager
的成员保持静态,您永远无法以这样的方式隔离它以使单元测试变得更好。
也许更好的解决方案是Singleton Pattern。为此,请删除CacheManager
成员上的静态修饰符。然后,您可以在应用中拥有一个静态实例,供其他人使用。因此,在单元测试中,您可以创建一个可以单独测试的类的新实例,但仍然具有所需的功能。
答案 1 :(得分:1)
简短的回答:你不能正确地做到这一点。单元测试和静态不能很好地结合在一起,你(几乎)总会遇到像你提到的那样的问题。
更长的答案:最好的解决方案是重构您的代码。即使你需要单例行为,你也有几个选择(例如依赖注入)。大卫的建议当然也是一个至少让你测试缓存的选项,但是当你想测试系统的其余部分时,你可能仍会遇到问题。
如果由于某种原因你想坚持你当前的设计,你仍然可以有一些(不是必要的好)解决方法。一些例子:
最简单的可能是添加“cleanCache”方法。在某些情况下,它甚至可能对系统的其余部分有用,并且您的每个测试也可以作为第一步(在“setup / beforeTest或类似方法”中)执行。
您还可以使用可见性进行游戏,并让您的测试进行清理,而其他代码则不允许这样做。
只要您不并行运行测试,这些黑客就可能会起作用。