2010-03-20 13 views
5

मैं .NET 2.0 फ्रेमवर्क, और, अगर लक्ष्यीकरण VS2008 का उपयोग करें, नहीं मैं इसे बदल नहीं सकते :)इकाई परीक्षण उद्देश्यों के लिए "आज की तारीख" कैसे भिन्न हो सकती है?

मैं एक DateCalculator वर्ग की है। इसकी विधि GetNextExpirationDate आधारभूत तिथि के रूप में आंतरिक रूप से DateTime.Today का उपयोग करके, अगले समाप्ति को निर्धारित करने का प्रयास करती है।

मैं इकाई परीक्षण लिख रहा था के रूप में, मुझे एहसास हुआ कि मैं अलग 'आज दिनांकों GetNextExpirationDate का परीक्षण करना चाहता था।

ऐसा करने का सबसे अच्छा तरीका क्या है? यहां कुछ विकल्प दिए गए हैं जिन पर मैंने विचार किया है:

  • तर्क baselineDate के साथ एक संपत्ति/अधिभारित विधि का पर्दाफाश करें और केवल इकाई परीक्षण से इसका उपयोग करें। वास्तविक क्लाइंट कोड में, baselineDate से DateTime.Today को उस विधि के पक्ष में संपत्ति/ओवरलोडेड विधि की उपेक्षा करें। मैं ऐसा करने में अनिच्छुक हूं क्योंकि यह डेटकुल्यूलेटर वर्ग के सार्वजनिक इंटरफ़ेस को अजीब बनाता है।
  • baselineDate नामक संरक्षित फ़ील्ड बनाएं जो आंतरिक रूप से DateTime.Today पर सेट है। परीक्षण करते समय, DateCalculatorForTestingDateCalculator से प्राप्त करें और निर्माता के माध्यम से baslineDate सेट करें। यह सार्वजनिक इंटरफ़ेस को साफ रखता है, लेकिन अभी भी बहुत अच्छा नहीं है - baselineDate संरक्षित किया गया था और परीक्षण के लिए पूरी तरह से व्युत्पन्न कक्षा की आवश्यकता है।
  • विस्तार विधियों का उपयोग करें। मैंने ExtensionAttribute जोड़ने के बाद इसे आजमाया, फिर एहसास हुआ कि यह काम नहीं करेगा क्योंकि एक्सटेंशन विधियां निजी/संरक्षित चर तक नहीं पहुंच सकती हैं। मैंने शुरू में सोचा कि यह वास्तव में काफी सुंदर समाधान था। :(

मैं सुनवाई क्या अन्य लोगों के बारे में सोच में रुचि होगी।

+0

अच्छा सवाल है ... यह है क्योंकि आप पर जो कुछ भी 'आज भरोसा अपने परीक्षण में नाकाम रहने को मिल रहा है एक विशिष्ट तिथि तक प्रतीक्षा करनी पड़ती हास्यास्पद हो जाएगी और यह भी वृद्धि नहीं कर सकते हैं :) – slugster

+0

डुप्लिकेट: http: //stackoverflow.com/questions/2425721/unit-testing-datetime-now –

+0

सभी इनपुट के लिए धन्यवाद। दिनांक समय प्रदाता दृष्टिकोण कुछ ऐसा था जो मुझे भी सोचना चाहिए था। इस मामले में, मुझे लगता है कि मैं गिशू के दृष्टिकोण के साथ जाऊंगा - ऐसा लगता है कि यह कम से कम काम और कम से कम आक्रामक है। –

उत्तर

1

मैं आम तौर पर एक अबास्ट्रक्शन/इंटरफ़ेस के अंदर ओएस को कॉल एकत्र करता हूं ताकि मैं आसानी से इसका परीक्षण कर सकूं .. जैसे एंड्रयू जैसा ऊपर बताया गया है।

हालांकि केवल प्रश्न में उल्लिखित आवश्यकता दी गई है; मुझे लगता है कि 'सबक्लास और ओवरराइड' यह करने के लिए सबसे सरल और कम से कम आक्रामक तरीका है - ओपी का विकल्प 2 विकल्प।

public class DateCalculator 
{ 
    public DateTime GetNextExpirationDate() { // call to GetBaseLineDate() to determine result } 
    virtual protected GetBaseLineDate() { return DateTime.Today; } 
} 

// in your test assembly 
public class DateCalcWithSettableBaseLine : DateCalculator 
{ 
    public DateTime BaseLine { get; set;} 
    override protected GetBaseLineDate() 
    { return this.BaseLine; } 
} 
4

आप एक इंटरफेस आधारभूत तारीख की आपूर्ति का उपयोग कर सकते हैं। आम तौर पर आप एक कार्यान्वयन कि DateTime.Today रिटर्न का प्रयोग करेंगे लेकिन के लिए परीक्षण प्रयोजनों है अपने इकाई परीक्षण एक तारीख की आपूर्ति देता है कि एक।

यह भी उपयोगी है अगर यह एक datebase सर्वर या कुछ अन्य मशीन है कि जरूरी नहीं कि वह जगह है जहाँ अपने कोड चल रहा है पर आज की तारीख का उपयोग करने के लिए आवश्यक हो जाता हो सकता है।

वास्तव में, यहां एक ही सवाल है मेरा की तुलना में कुछ अधिक विस्तृत जवाब:

public DateTime GetNextExpirationDate() 
{ 
    return GetNextExpirationDate(DateTime.Today); 
} 

internal DateTime GetNextExpirationDate(DateTime after) 
{ 
    // implementation goes here 
} 

फिर आप InternalsVisibleToAttribute उपयोग कर सकते हैं अधिभार दृश्यमान बनाने के लिए: Unit Testing: DateTime.Now

1

एक विकल्प एक आंतरिक अधिभार जो दिनांक समय लेता है बनाने के लिए, और प्रतिनिधि है कि करने के लिए वास्तविक कार्यान्वयन है अपनी टेस्ट असेंबली में, और आपकी टेस्ट असेंबली इसे अपने स्वयं के चयन के डेटटाइम मानों के साथ कॉल कर सकती है।

0

जो कंप्यूटर परीक्षण कर रहा है पर ऑपरेटिंग सिस्टम के समय दिन-का-घड़ी बदल सकते हैं। यह आसान और पारदर्शी है, लेकिन फ़ाइल टाइमस्टैम्प के साथ समस्याओं के लिए बाहर देखो।

संबंधित मुद्दे