2012-09-16 108 views
4

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

我只是想检查的过程中,例如:

1-当产品不在缓存中,方法应该打数据库

2-下次方法应使用缓存

-3-时的变化到数据库进行,高速缓存应该被清除

4-如果从DATABSE检索的数据为空时,它不应该被添加到高速缓存

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

+1

如果你向我们展示一些代码,你想达到什么,我们将能够提供帮助。 – Baz1nga

+0

@ Baz1nga:问题已更新 –

+1

@reza你一定想根据你的更新来研究嘲笑。您不想直接与数据库交谈,因为它们会降低您的测试速度。请参阅我的回答以获取非常简短的介绍。这将由你来研究如何/嘲笑什么。 – Finglas

回答

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的行为,而不是实际缓存/检索任何东西。

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

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

+0

他说,他增加了一个缓存层,所以我猜OP已经推出了自己的解决方案 – Baz1nga

+0

@Finglas:是的,我已经推出了自己,是的,我不想检查项目添加与否,都可以你告诉更多关于基于验证的测试和如何做到这一点 –

+0

@reza肯定 - 我会尽快更新我的答案。 – Finglas