清除单元测试之间的私有静态变量

问题描述 投票:0回答:1

我有一个看起来与此相似的类:

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单元测试方法中重置此静态变量?

unit-testing .net-core nunit private .net-core-3.1
1个回答
0
投票

[不确定您是否会认为这是一个答案,或者只是很长的评论。 :-)

您的测试运行良好,因为它们告诉您一些信息。他们说“这是静态实例的错误使用。”

统计信息总是可疑的,尽管并不总是坏的。不好的是,您使用静态方法来实现单例模式,而这种方式随后便无法控制。也就是说,您的各个实例正在自行决定要使用哪个缓存(单例),而不是被告知要使用什么缓存。

正如@Vaccano所建议的,最好使用某种依赖注入。将其翻译为“告诉每个对象要使用的缓存,而不是让它们自己弄清楚”。这是需要一些前期投资才能避免以后节省麻烦的事情之一。

顺便说一句...更改应用程序以使其更具可测试性没有错。可测试性只是定义好的软件设计的那些“缺点”中的另一个。诀窍是要对其进行更改以改进软件,通常是对其进行简化而不是使其复杂化。

© www.soinside.com 2019 - 2024. All rights reserved.