我有一个看起来与此相似的类:
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
单元测试方法中重置此静态变量?
[不确定您是否会认为这是一个答案,或者只是很长的评论。 :-)
您的测试运行良好,因为它们告诉您一些信息。他们说“这是静态实例的错误使用。”
统计信息总是可疑的,尽管并不总是坏的。不好的是,您使用静态方法来实现单例模式,而这种方式随后便无法控制。也就是说,您的各个实例正在自行决定要使用哪个缓存(单例),而不是被告知要使用什么缓存。
正如@Vaccano所建议的,最好使用某种依赖注入。将其翻译为“告诉每个对象要使用的缓存,而不是让它们自己弄清楚”。这是需要一些前期投资才能避免以后节省麻烦的事情之一。
顺便说一句...更改应用程序以使其更具可测试性没有错。可测试性只是定义好的软件设计的那些“缺点”中的另一个。诀窍是要对其进行更改以改进软件,通常是对其进行简化而不是使其复杂化。