首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单元测试CacheManager

单元测试CacheManager
EN

Stack Overflow用户
提问于 2010-06-24 07:08:24
回答 2查看 1.2K关注 0票数 5

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

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

代码语言:javascript
复制
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;
           }
       }
   }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-24 08:29:02

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

也许更好的解决方案是单例模式。要做到这一点,请去掉CacheManager成员上的静态修饰符。然后,您可以在应用程序中拥有一个其他人都使用的静态实例。因此,在单元测试中,您可以创建一个类的新实例,您可以对其进行隔离测试,但仍然具有所需的功能。

票数 1
EN

Stack Overflow用户

发布于 2010-06-24 08:41:57

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

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

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

最简单的方法可能是添加"cleanCache“方法。在某些情况下,它甚至可能对系统的其他部分有用,而且每个测试都可以作为第一步(在“安装/预测试或类似方法”中)。

您还可以使用可见性,并让您的测试进行清理,这在代码的其余部分是不允许的。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3107861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档