2008-10-28 58 views
9

我想在沒有單元測試的項目中實現一個函數的單元測試,並且此函數需要System.Web.Caching。緩存對象作爲參數。我一直試圖通過使用代碼,如創建該對象...在單元測試中創建一個System.Web.Caching.Cache對象

System.Web.Caching.Cache cache = new System.Web.Caching.Cache(); 
cache.Add(...); 

...然後經過「緩存」作爲參數,但Add()函數導致一個NullReferenceException。到目前爲止,我的最佳猜測是我無法在單元測試中創建此緩存對象,並且需要從HttpContext.Current.Cache中檢索它,我明顯無法在單元測試中訪問它。

你如何單元測試一個需要System.Web.Caching.Cache對象作爲參數的函數?

+1

你能否在問題中糾正你的拼寫問題,以便人們可以更容易地找到它? Cachcing =緩存 (不是試圖挑選你或任何東西 - 只是想幫助) – Chris 2009-11-13 04:25:06

回答

8

當我面對這類問題時(有問題的類沒有實現一個接口),我經常最終在有問題的類的周圍編寫一個包含相關接口的包裝器。然後我在我的代碼中使用我的包裝器。對於單元測試,我手動模擬包裝並插入我自己的模擬對象。

當然,如果一個模擬框架有效,那就用它來代替。我的經驗是所有的嘲笑框架都有各種.NET類的問題。

public interface ICacheWrapper 
{ 
    ...methods to support 
} 

public class CacheWrapper : ICacheWrapper 
{ 
    private System.Web.Caching.Cache cache; 
    public CacheWrapper(System.Web.Caching.Cache cache) 
    { 
     this.cache = cache; 
    } 

    ... implement methods using cache ... 
} 

public class MockCacheWrapper : ICacheWrapper 
{ 
    private MockCache cache; 
    public MockCacheWrapper(MockCache cache) 
    { 
     this.cache = cache; 
    } 

    ... implement methods using mock cache... 
} 

public class MockCache 
{ 
    ... implement ways to set mock values and retrieve them... 
} 

[Test] 
public void CachingTest() 
{ 
    ... set up omitted... 

    ICacheWrapper wrapper = new MockCacheWrapper(new MockCache()); 

    CacheManager manager = new CacheManager(wrapper); 

    manager.Insert(item,value); 

    Assert.AreEqual(value, manager[item]); 
} 

真正的代碼

... 

CacheManager manager = new CacheManager(new CacheWrapper(HttpContext.Current.Cache)); 

manager.Add(item,value); 

... 
2

我認爲你最好的選擇是使用模擬對象(看Rhino Mocks)。

1

單元測試的遺留代碼一個非常有用的工具是TypeMock Isolator。它將允許您完全繞過緩存對象,方法是告訴它模擬該類以及發現有問題的任何方法調用。與其他模擬框架不同,TypeMock使用反射來攔截您告訴它爲您模​​擬的那些方法調用,因此您不必處理繁瑣的包裝。

TypeMock 是一個商業產品,但它有免費版本的開源項目。他們使用有一個「社區」版本,這是一個單用戶許可證,但我不知道這是否仍然提供。

0
var httpResponse = MockRepository.GenerateMock<HttpResponseBase>(); 
var cache = MockRepository.GenerateMock<HttpCachePolicyBase>(); 
    cache.Stub(x => x.SetOmitVaryStar(true)); 
    httpResponse.Stub(x => x.Cache).Return(cache); 
    httpContext.Stub(x => x.Response).Return(httpResponse); 
    httpContext.Response.Stub(x => x.Cache).Return(cache); 
相關問題