我在项目中添加了缓存层。现在我想知道我是否可以单元测试操作缓存的方法?或者有更好的方法来测试Layer的逻辑吗?
我只是想检查一下这个过程,例如:
1-当项目不在缓存中时,方法应该命中数据库
2-下一次方法应该使用缓存
3-当对数据库进行更改时,应清除缓存
4-如果从数据库检索的数据为空,则不应将其添加到缓存
我想确保我放入方法的逻辑按预期工作。
答案 0 :(得分:3)
我认为缓存是第三方缓存?如果是这样,我不会测试它。否则你正在测试别人的代码。
如果此缓存非常重要,您需要对其进行测试,我会进行integration或acceptance测试。换句话说,点击相关的页面/服务并检查内容。根据您要测试的内容的定义,这是不 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测试。例如,您添加/删除项目。
就像我之前说的那样,根据你的意愿,这可能有些过分。但是你似乎非常有信心缓存非常重要,足以保证这种测试。在我的代码中,我尝试尽可能地限制模拟对象,尽管这听起来像是一个有效的用例。