【问题标题】:how to unit testing cache layer如何对缓存层进行单元测试
【发布时间】:2012-09-16 20:55:29
【问题描述】:

我在我的项目中添加了一个缓存层。现在我想知道我是否可以单元测试 操作缓存的方法?还是有更好的方法来测试 Layer 的逻辑?

我只是想检查进程,例如:

1-当项目不在缓存中时,方法应该命中数据库

2- 下次方法应该使用缓存

3- 对数据库进行更改时,应清除缓存

4- 如果从数据库中检索到的数据为 null ,则不应将其添加到缓存中

我想确保我放入方法中的逻辑按预期工作。

【问题讨论】:

  • 如果您向我们展示一些代码以及您想要实现的目标,我们将能够提供帮助..
  • @Baz1nga :问题已更新
  • @reza 你肯定想根据你的更新来研究模拟。您不想直接与您的数据库对话,因为它们会减慢您的测试速度。请参阅我的答案以获得非常简短的介绍。然后由你来研究如何/模拟什么。
  • @Finglas:是的,我正在使用模拟来避免直接访问数据库,但我不知道我可以对缓存做同样的事情!谢谢

标签: asp.net unit-testing caching


【解决方案1】:

我假设缓存是第三方缓存?如果是这样,我不会测试它。您正在测试其他人的代码。

如果此缓存非常重要,您需要对其进行测试,我会使用integrationacceptance 测试。换句话说,点击有问题的页面/服务并以这种方式检查内容。根据您要测试的内容的定义,这不是unit test

另一方面,如果缓存是您自己滚动的缓存,您将能够轻松地对功能进行单元测试。您可能需要检查基于验证的测试以测试缓存的行为,与实际检查从缓存中添加/删除的内容相反。查看mocking 了解实现此目的的方法。

要通过 Mock 对象(或类似的东西)测试行为,我会执行以下操作 - 尽管您的代码会有所不同。

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) 是否被调用。并不是说该项目实际上是从缓存中检索到的。这是测试应该如何使用缓存器的行为,而不是它实际上正在缓存/检索任何东西。

然后,您可以回退到对缓存器进行隔离的基于状态的测试。例如,您添加/删除项目。

就像我之前所说的,这可能有点矫枉过正,这取决于你想做什么。但是,您似乎非常有信心缓存足够重要以保证进行此类测试。在我的代码中,我尝试尽可能地限制模拟对象,尽管这听起来像是一个有效的用例。

【讨论】:

  • 他说他添加了一个缓存层,所以我猜 OP 已经推出了他自己的解决方案
  • @Finglas : 是的,我已经自己翻滚了,是的,我不想检查是否添加了项目,你能告诉更多关于基于验证的测试以及如何做到这一点跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-08
  • 1970-01-01
  • 2019-11-02
  • 1970-01-01
  • 1970-01-01
  • 2021-03-15
相关资源
最近更新 更多