我有这个CacheManager类,它使用各种缓存的数据保存一个静态字典。但是,由于这个字典是静态的,它会被来自其他单元测试的数据填满。这使我无法对init上的CacheManager是否为空进行单元测试,并且违背了单元测试的原则。
有什么想法,如何创建一个适当的单元测试吗?
码
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;
}
}
}发布于 2010-06-24 08:29:02
一般来说,从测试的角度来看,这不是一个好主意。通过使CacheManager的成员是静态的,您将永远无法以这样的方式隔离它,从而使它更适合单元测试。
也许更好的解决方案是单例模式。要做到这一点,请去掉CacheManager成员上的静态修饰符。然后,您可以在应用程序中拥有一个其他人都使用的静态实例。因此,在单元测试中,您可以创建一个类的新实例,您可以对其进行隔离测试,但仍然具有所需的功能。
发布于 2010-06-24 08:41:57
简短的回答:你做得不好。单元测试和静力学并不是很好地结合在一起,你会(几乎)总是遇到像你提到的问题。
更长的答案:最好的解决方案是重构代码。即使您需要单例行为,也有几个选项(例如依赖注入)。David的建议当然也是一个选项,至少可以让您测试缓存,但是当您想测试系统的其他部分时,您可能仍然会遇到问题。
如果出于某种原因,你想坚持你目前的设计,你仍然可以有一些(不是必要的,很好)的解决办法。下面是一些例子:
最简单的方法可能是添加"cleanCache“方法。在某些情况下,它甚至可能对系统的其他部分有用,而且每个测试都可以作为第一步(在“安装/预测试或类似方法”中)。
您还可以使用可见性,并让您的测试进行清理,这在代码的其余部分是不允许的。
只要您不并行运行测试,这些黑客可能就会工作。
https://stackoverflow.com/questions/3107861
复制相似问题