2012-04-30 14 views
7

Bazı birim testi yazıyorum ve Cache alay etmenin avantajlı olup olmadığını merak ediyorum ve eğer öyleyse, nasıl? Benim testlerde ŞuMocking System.Web.Caching.Cache - Boşluk veya boş için denetle?

Ben HttpContextBase dışarı alay ve özel bir HttpContextFactory sararak ediyorum:

var mockedHttpContextBase = new Mock<HttpContextBase>(); 

IHttpContextFactory httpContextFactory = new HttpContextFactory 
{ 
    Current = mockedHttpContextBase.Object 
}; 

ve benim kod IHttpContextFactory tüketir zaman önbellek onunla bir şey yapmadan önce boş olup olmadığını kontrol edin.

var cache = _httpContextFactory.Current.Cache; 

Func<SomeReturnType> doSomeWork =() => _foo.someMethodIExecute(param1,param2); 

return cache != null ? cache.GetOrStore("doSomeWorkCacheKey",doSomeWork, 900) 
        : doSomeWork.Invoke(); 

doğru böyle boş bunu kullanmak veya birim testleri çalıştırırken o boş değil böylece testinde de önbellek dalga geçeyim her an önbelleği için kontrol etmek mi?

cevap

3

kodunuzu önbellek null olabilir varsayar ve (şimdi olduğu gibi), her önbellek erişimi için iki birim testleri olması gerekir erişmeden önce denetimler gerçekleştirir ise:

  • önbellek varsa ve öğedir saklanır ve
  • önbellek boş (GetOrStore çağrıyı kontrol) alınan ve bu ortak model (boş kontrolünün) ise sadece temsilci çağırmayı

iddia, Her defasında önbellek bağımlılığı gerektiren iki test yapmak yerine, Null Object Pattern'a sarmayı öneririm ve bir kez ve daha sonra sınanması NOP'yi alay edilebilecek bir bağımlılık olarak kullanır.

Düzenleme: cache "alay" örnek

var cache = new Cache(); 
// Add takes more parameters; fill whatever is necessary to make it work 
cache.Add("doSomeWorkCacheKey", doSomeWork, ...); 
var mockedHttpContextBase = new Mock<HttpContextBase>(); 
// tell your mock to return pre-configured cache 
mockedHttpContextBase.Setup(m => m.Cache).Returns(cache); 

IHttpContextFactory httpContextFactory = new HttpContextFactory 
{ 
    Current = mockedHttpContextBase.Object 
}; 
+0

Teşekkürler Jimmy. 1. nokta ile ilgili olarak, varolan önbelleğe bağlı bir sınama nasıl yazılır? Bu durumda testi yapmak için önbelleği nasıl alay ediyorsun? –

+0

@JamieDixon: Gerçekten "Önbellek" ile mühürlenmiş olamaz; Gerçek 'Cache' uygulamasını kullanarak bunu önceden yapılandırmanız ve" HttpContextBase "inizin önceden yapılandırılmış önbellek istendiğinde döndürülmesi gerekir. Gönderiye örnek ekledim. –

+0

Tekrar teşekkürler Jimmy. Zamanını ve yardımını takdir ediyorum. Daha fazla arama yaptıktan sonra kendime bir cevap ekledim. Ben 'HttpRuntime.Cache' kullanarak daha uygun çünkü her şey yapılandırılmamışsa 'System.Web.Caching.Cache' 'NullReferenceExeption' atmak gibi çalışacak her şeyi çalışacak. –

13

bunu arama yapmak biraz sonra benim birim testleri yazarken ben System.Web.Caching.Cache yerine HttpRuntime.Cache kullanabilirsiniz görünüyor.

Öyle ki:

var mockedHttpContextBase = new Mock<HttpContextBase>(); mockedHttpContextBase.Setup(m => m.Cache).Returns(HttpRuntime.Cache);

önbellek null (o olsaydı, uygun bir istisna olurdu) bu yüzden benim kodundan kontrol null başvuru kaldırabilir olmamalıdır.

+0

HttpRuntime.Cache – BozoJoe

+0

ile UnMoq'able mühürlü System.Web.Caching.Cache yanlamasına iyi hareket Bu benim için işe yaramadı çünkü benim testlerim uyumsuz. Bu nedenle, "HttpRuntime.Cache", her bir test için değil, durumu paylaşır. Testleri tek tek çalıştırırken çalışır. –

+0

Açık olmak gerekirse - bu durumda bir önbellek oluşturmazsınız. Sahte sürümü kullanmadan önce öğelerinizi HttpRuntime.Cache öğesine ekleyin. 'HttpRuntime.Cache.Add (cacheKey, sampleUser, null, DateTime.Now.AddHours (2), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null); var context = new Mock (); context.Setup (x => x.Cache) .Returns (HttpRuntime.Cache); ' – Lavamantis