清理单元测试之间的私有静态变量
Posted
技术标签:
【中文标题】清理单元测试之间的私有静态变量【英文标题】:Clean up private static variables between unit tests 【发布时间】:2020-06-17 05:45:22 【问题描述】:我有一个类似这样的类:
public class DiscoveryDocumentCache
static DiscoveryDocumentCache()
cache = new MemoryCache(discoveryDocumentCacheName);
private static MemoryCache cache;
// Other stuff...
我希望内存缓存是静态的,以便在类的所有实例之间共享。
它非常适合实际用例。我挣扎的地方是我的单元测试。因为cache
变量是静态的,所以它会累积放入其中的所有不同值。
我的用例没有“删除”选项。 (它们只是在缓存中过期。)
我已将此添加到我的 DiscoveryDocumentCache
课程中:
public void __UnitTesting__CleanUpMemoryCacheBetweenTests()
cache.Dispose();
cache = new MemoryCache(discoveryDocumentCacheName);
但是添加一个只是为了方便单元测试的方法感觉很脏。
.NET Framework 有一些方法可以访问类的私有变量,如果您真的认为应该这样做的话。 在我的TearDown
单元测试方法中我可以做类似的事情来重置这个静态变量吗?
【问题讨论】:
就我个人而言,我会回避静态对象。也许注入某种缓存工厂,为您提供可能是也可能不是单例/静态/其他的缓存对象。然后你可以手动将你选择的缓存对象注入到你的可测试对象中。 【参考方案1】:不确定您是否会认为这是一个答案,或者只是一个长评论。 :-)
您的测试运行良好,因为它们告诉您一些事情。他们说“这是对静态实例的错误使用。”
静态总是可疑的,尽管并不总是坏的。这里的坏处是您使用静态以一种随后无法控制的方式实现单例模式。也就是说,您的各个实例自己决定使用哪个缓存(单例),而不是被告知使用什么。
正如@Vaccano 所建议的,您最好使用某种依赖注入。将其翻译为“告诉每个对象使用什么缓存,而不是让他们自己弄清楚。”这是需要一些前期投资以避免以后麻烦的事情之一。
顺便说一句...更改应用程序以使其更易于测试并没有错。可测试性只是定义好的软件设计的另一个“功能”。诀窍是改变它以改进软件,通常是简化而不是复杂化。
【讨论】:
以上是关于清理单元测试之间的私有静态变量的主要内容,如果未能解决你的问题,请参考以下文章