如何单元测试缓存层

时间:2012-09-16 12:33:42

标签: asp.net unit-testing caching

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

我只是想检查一下这个过程,例如:

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

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

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

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

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

1 个答案:

答案 0 :(得分:3)

我认为缓存是第三方缓存?如果是这样,我不会测试它。否则你正在测试别人的代码。

如果此缓存非常重要,您需要对其进行测试,我会进行integrationacceptance测试。换句话说,点击相关的页面/服务并检查内容。根据您要测试的内容的定义,这是 a 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)是否被调用。并不是该项目实际上是从缓存中检索的。这是测试应该如何使用cacher的行为,而不是实际缓存/检索任何内容。

然后,您可以孤立地回退到基于状态的Cacher测试。例如,您添加/删除项目。

就像我之前说的那样,根据你的意愿,这可能有些过分。但是你似乎非常有信心缓存非常重要,足以保证这种测试。在我的代码中,我尝试尽可能地限制模拟对象,尽管这听起来像是一个有效的用例。