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



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

我只想检查流程,例如:

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

2-下次方法应使用缓存

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

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

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

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

如果这个缓存非常重要,您需要对它进行测试,我会进行集成或验收测试。换句话说,点击有问题的页面/服务并以这种方式检查内容。根据您想要测试的定义,这不是单元测试。

另一方面,如果缓存是你自己滚动的,那么你就可以很容易地对功能进行单元测试。您可能想要检查基于验证的测试,以便测试缓存的行为,就像实际检查是否从缓存中添加/删除内容一样。看看嘲讽可以找到实现这一点的方法。

为了通过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测试。例如,添加/删除项目。

正如我之前所说,这可能有些过头了,这取决于你想做什么。然而,你似乎很有信心缓存足够重要,可以保证进行这种测试。在我的代码中,我尽量限制mock对象,尽管这听起来是一个有效的用例。

最新更新