我在我的项目中添加了一个缓存层。现在我想知道我是否可以对操纵缓存的方法进行单元测试?还是有更好的方法来测试图层的逻辑?
我只想检查过程,例如:
1-当项目不在缓存中时,方法应该命中数据库
2-下次方法应该使用缓存
3-当对数据库进行更改时,应清除缓存
4-如果从数据库中检索的数据为 null ,则不应将其添加到缓存中
我想确保我放入方法中的逻辑按预期工作。
我在我的项目中添加了一个缓存层。现在我想知道我是否可以对操纵缓存的方法进行单元测试?还是有更好的方法来测试图层的逻辑?
我只想检查过程,例如:
1-当项目不在缓存中时,方法应该命中数据库
2-下次方法应该使用缓存
3-当对数据库进行更改时,应清除缓存
4-如果从数据库中检索的数据为 null ,则不应将其添加到缓存中
我想确保我放入方法中的逻辑按预期工作。
我假设缓存是第三方缓存?如果是这样,我不会测试它。否则,您正在测试其他人的代码。
如果此缓存非常重要,您需要对其进行测试,我会进行集成或验收测试。换句话说,点击有问题的页面/服务并以这种方式检查内容。根据您希望测试的定义,这不是单元测试。
另一方面,如果缓存是您自己滚动的缓存,您将能够轻松地对功能进行单元测试。您可能想要检查基于验证的测试以测试缓存的行为,就像实际检查从缓存中添加/删除的内容一样。查看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();
}
为了测试上述方法,我将进行一个使用 mock 的测试Cacher
。您需要在运行时将其传递给方法或将依赖项注入构造函数。从这里开始,测试将简单地检查是否cache.Get(50)
被调用。并不是说该项目实际上是从缓存中检索到的。这是测试应该如何使用缓存器的行为,而不是它实际上正在缓存/检索任何东西。
然后,您可以单独退回到基于状态的缓存器测试。例如,您添加/删除项目。
就像我之前说的那样,这可能有点矫枉过正,这取决于你想做什么。但是,您似乎非常有信心缓存足够重要以保证进行此类测试。在我的代码中,我尝试尽可能地限制模拟对象,尽管这听起来像是一个有效的用例。