我在我的項目中添加了一個緩存層。現在我想知道如果我可以單元測試操縱緩存的方法?還是有更好的方法來測試Layer的邏輯?如何對單元測試緩存層
我只是想檢查的過程中,例如:
1-當產品不在緩存中,方法應該打數據庫
2-下次方法應使用緩存
-3-時的變化到數據庫進行,高速緩存應該被清除
4-如果從DATABSE檢索的數據爲空時,它不應該被添加到高速緩存
我想確保我放入方法的邏輯能夠按預期工作。
我在我的項目中添加了一個緩存層。現在我想知道如果我可以單元測試操縱緩存的方法?還是有更好的方法來測試Layer的邏輯?如何對單元測試緩存層
我只是想檢查的過程中,例如:
1-當產品不在緩存中,方法應該打數據庫
2-下次方法應使用緩存
-3-時的變化到數據庫進行,高速緩存應該被清除
4-如果從DATABSE檢索的數據爲空時,它不應該被添加到高速緩存
我想確保我放入方法的邏輯能夠按預期工作。
我假設緩存是第三方緩存?如果是這樣,我不會測試它。否則,你正在測試別人的代碼。
如果這個緩存是很重要的,你需要測試它,我會用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的行爲,而不是實際緩存/檢索任何東西。
然後,您可以回退到基於狀態的單獨測試。例如,您可以添加/刪除項目。
就像我之前說過的,這可能是矯枉過正,取決於你想做什麼。不過,你似乎非常確信緩存足夠重要,以保證這種測試。在我的代碼中,我嘗試儘可能限制模擬對象,儘管這聽起來像是一個有效的用例。
如果你向我們展示一些代碼,你想達到什麼,我們將能夠提供幫助。 – Baz1nga
@ Baz1nga:問題已更新 –
@reza你一定想根據你的更新來研究嘲笑。您不想直接與數據庫交談,因爲它們會降低您的測試速度。請參閱我的回答以獲取非常簡短的介紹。這將由你來研究如何/嘲笑什麼。 – Finglas