如何对缓存层进行单元测试

5
我已经给我的项目添加了一个缓存层。我想知道是否可以对操作缓存的方法进行单元测试?或者是否有更好的方法来测试层的逻辑?
我只是想检查这个过程,例如:
1- 当缓存中没有项目时,方法应该查询数据库。
2- 下一次方法应该使用缓存。
3- 当对数据库进行更改时,缓存应该被清除。
4- 如果从数据库检索到的数据为空,则不应将其添加到缓存中。
我希望确保我放入方法中的逻辑按预期工作。

1
如果您展示给我们一些代码和您想要实现的目标,我们就能够提供帮助。 - Baz1nga
@Baz1nga:问题已更新。 - mohsen dorparasti
1
@reza 根据你的更新,你肯定想要了解一下模拟测试。你不想直接与数据库交互,因为这会减慢你的测试速度。请参考我的答案,了解简要介绍。然后你需要自己研究如何/什么进行模拟测试。 - Finglas
@Finglas :是的,我正在使用模拟来避免直接访问数据库,但我不知道我也可以使用缓存来做同样的事情!谢谢。 - mohsen dorparasti
1个回答

3

我假设缓存是第三方的,如果是这样的话,我不会测试它。否则你就是在测试别人的代码。

如果缓存非常重要并且需要测试它,我建议使用集成测试验收测试。换句话说,访问相关页面/服务并检查内容即可。根据您所希望测试的定义,这不是单元测试

相反,如果缓存是你自己创建的,你可以很容易地对其功能进行单元测试。你可能想通过验证来测试缓存的行为,而不是实际检查缓存中添加/删除的内容。了解模拟对象来实现这一点。

为了通过模拟对象(或类似物)测试行为,我将执行以下操作-尽管您的代码将有所不同。

class Cacher
{
    public void Add(Thing thing) 
    {
         // Complex logic here...
    }

    public Thing Get(int id) 
    { 
        // More complex logic here...
    } 
}

void DoStuff() 
{
   var cacher = new Cacher();
   var thing = cacher.Get(50);
   thing.Blah();
}

为了测试上述方法,我会使用一个模拟的Cacher进行测试。您需要在运行时将其传递到该方法中或将依赖项注入构造函数中。从这里开始,测试将仅检查是否调用了cache.Get(50)。并不是实际从缓存中检索项目。这是测试如何使用缓存器的行为,而不是实际缓存/检索任何内容。
然后,您可以回退到隔离的Cacher的基于状态的测试中。例如添加/删除项目。
就像我之前所说,根据您希望做什么,这可能过于复杂。然而,您似乎非常自信缓存足以证明这种类型的测试是必要的。在我的代码中,我尽量减少模拟对象的使用,但这听起来是一个有效的用例。

他说他添加了一个缓存层,所以我猜测 OP 已经推出了自己的解决方案。 - Baz1nga
@Finglas:是的,我已经进行了自测,而且我不想检查是否已添加项目,您能否更多地介绍基于验证的测试以及如何进行测试? - mohsen dorparasti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接