編輯:我發現了一個更簡單的方法來做到這一點,至少當你空緩存測試。使用HttpRunTime.Cache作爲您對HttpContext的Cache屬性期望值的返回值。對於更高級的場景,使用包裝器和模擬可能仍然是更好的方式來處理它 - 例如,如果您需要測試緩存中的異常。
var httpContext = MockRepository.GenerateMock<HttpContextBase>();
httpContext.Expect(h => h.Cache).Return(HttpRunTime.Cache).Repeat.Any()
原始:
包裝類是要走的路,但我認爲你是在錯誤的地方應用它。我會給我的控制器一個CacheWrapper屬性,然後創建一個構造函數,允許我傳遞一個CacheWrapper實例,該屬性可以被設置。默認情況下,控制器使用HttpContext.Current.Cache創建一個CacheWrapper。在您的測試代碼中,構建一個模擬CacheWrapper以傳入控制器的構造函數。這樣你就不需要創建一個模擬Cache對象 - 這很難,因爲它是一個密封的類。
或者,您可以實例化一個Cache類的實例並返回它,因爲它有一個公共構造函數。使用模擬的優點是你可以通過期望來驗證Cache是否被使用,所以我可能會使用包裝器。
public class CacheWrapper
{
private Cache Cache { get; set; }
public CacheWrapper()
{
this.Cache = HttpContext.Current.Cache;
}
public virtual Object Add(string key,
Object value,
CacheDependency dependencies,
DateTime absoluteExpiration,
TimeSpan slidingExpiration,
CacheItemPriority priority,
CacheItemRemovedCallback onRemoveCallback)
{
this.Cache.Add(key,
value,
dependencies,
absoluteExpiration,
slidingExpiration,
priority,
onRemoveCallback);
}
...wrap other methods...
}
public class BaseController : Controller
{
private CacheWrapper { get; set; }
public BaseController() : this(null) { }
public BaseController(CacheWrapper cache)
{
this.CacheWrapper = cache ?? new CacheWrapper();
}
}
[TestMethod]
public void CacheTest()
{
var wrapper = MockRepository.GenerateMock<CacheWrapper>();
wrapper.Expect(o => o.Add(...)).Return(...);
var controller = new BaseController(wrapper);
var result = controller.MyAction() as ViewResult;
Assert.AreEqual(...);
wrapper.VerifyAllExpectations();
}
偉大的筆記真的幫助這使整個過程更簡單 – P6345uk 2016-04-05 09:29:31