2012-09-16 121 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