2008-10-28 18 views
9

में एक सिस्टम.Web.Caching.Cache ऑब्जेक्ट बनाना, मैं एक ऐसे प्रोजेक्ट में फ़ंक्शन के लिए यूनिट टेस्ट को कार्यान्वित करने का प्रयास कर रहा हूं जिसमें यूनिट परीक्षण नहीं है और इस फ़ंक्शन को System.Web.Caching की आवश्यकता है। एक पैरामीटर के रूप में कैश ऑब्जेक्ट। मैं इस तरह के रूप कोड का उपयोग करके इस वस्तु बनाने के लिए कोशिश कर दिया गया है ...एक यूनिट टेस्ट

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

... और फिर एक पैरामीटर के रूप में 'कैश' से गुजर रहा है, लेकिन जोड़ें() फ़ंक्शन एक NullReferenceException खड़ी कर रहा है। मेरा सबसे अच्छा अनुमान यह है कि मैं इस कैश ऑब्जेक्ट को यूनिट टेस्ट में नहीं बना सकता और इसे HttpContext.Current.Cache से पुनर्प्राप्त करने की आवश्यकता है जिसे मैं स्पष्ट रूप से यूनिट टेस्ट में एक्सेस नहीं करता हूं।

आप एक ऐसे फ़ंक्शन का परीक्षण कैसे करते हैं जिसके लिए System.Web.Caching.Cache ऑब्जेक्ट को पैरामीटर के रूप में आवश्यक है?

+1

क्या आप इस प्रश्न में अपनी वर्तनी को सही कर सकते हैं, ताकि लोग इसे आसान पा सकें? कैचिंग = कैशिंग (आपको या कुछ भी लेने का प्रयास नहीं कर रहा है - बस मदद करने की कोशिश कर रहा है) – Chris

उत्तर

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

मुझे लगता है कि आपकी सबसे अच्छी शर्त एक नकली वस्तु (राइनो मोक्स में देखें) का उपयोग करना होगा।

1

इकाई परीक्षण विरासत कोड के लिए एक बहुत ही उपयोगी उपकरण TypeMock Isolator है। यह आपको उस वर्ग को नकल करने के लिए पूरी तरह से कैश ऑब्जेक्ट को बाईपास करने की अनुमति देगा और आपको किसी भी विधि कॉल को समस्याग्रस्त लगता है। अन्य नकली ढांचे के विपरीत, 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); 
संबंधित मुद्दे