4

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

我只想检查过程,例如:

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

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

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

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

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

4

1 回答 1

3

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

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

另一方面,如果缓存是您自己滚动的缓存,您将能够轻松地对功能进行单元测试。您可能想要检查基于验证的测试以测试缓存的行为,就像实际检查从缓存中添加/删除的内容一样。查看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)被调用。并不是说该项目实际上是从缓存中检索到的。这是测试应该如何使用缓存器的行为,而不是它实际上正在缓存/检索任何东西。

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

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

于 2012-09-16T12:37:36.060 回答