2010-06-28 8 views
6

वर्तमान में मैं एक घटक के लिए एक यूनिट परीक्षण लिख रहा हूं जो डेटाटाइम विशिष्ट सत्यापन करता है। मैंने IDateTimeProvider इंटरफ़ेस बनाया है, जो DateTime.UtcNow कुरकुरा और व्यावसायिक ऑब्जेक्ट्स के रूप में कार्य करता है DateTime से सीधे इंटरफ़ेस का उपयोग करता है। ऐसा लगता है कि डेटटाइम थोड़ी अधिक अधिभारित है और इसे एक मूल्य में विभाजित किया जाना चाहिए और एक चीज जो ओएस से वह मान प्राप्त करती है। मुझे आश्चर्य है कि क्या कोई विशेष कारण नहीं है कि IDateTimeProvider (IClock) .NET में इंटरफ़ेस न हो?.NET और डेटटाइम में कोई IDateTimeProvider क्यों नहीं है अब गेटर?

उत्तर

7

बस शब्दों में कहें: क्योंकि बीसीएल के बड़े हिस्से को टेस्टेबिलिटी के लिए डिज़ाइन नहीं किया गया था।

"कोर" कार्यक्षमता के संदर्भ में यादृच्छिक संख्या पीढ़ी के लिए भी यही सच है - और बहुत से HTTP- संबंधित वर्ग नकली बाहर बहुत खराब हैं :(कम से कम इस मामले में यह स्वयं को पेश करना आसान है । घड़ी इंटरफ़ेस

प्लस तरफ, जब Noda Time उत्पादन प्रयोग के लिए तैयार है, यह केवल बीसीएल तुलना में एक बेहतर दिनांक/समय एपीआई प्रदान नहीं करेगा - यह एक अधिक परीक्षण के अनुकूल एक प्रदान करेंगे :)

+0

भूलना नहीं है, System.IO ... –

1

हम लगातार डेटटाइमप्रोवाइडर रैपर क्लास का उपयोग करते हैं, यदि आवश्यक हो तो हम परीक्षण संदर्भ में ओवरराइड कर सकते हैं ...

0

http://learn.typemock.com/typemock-isolator/ डेटटाइम (और अन्य mscorlib प्रकार) का नकल करने में सक्षम है, इसलिए डेटटाइम.अब फिर से कोई समस्या नहीं है। लेकिन नुकसान यह है कि इससे डेवलपर्स अपनी सामग्री को अधिक खराब तरीके से डिजाइन कर सकते हैं क्योंकि डेटटाइम का मज़ाक उड़ाने में कोई समस्या नहीं है.अब!

शायद IDateTimeProvider जैसे कुछ का उपयोग ऐसी चीजों के लिए एक बेहतर समाधान है।

लेकिन यदि आप किसी तृतीय-पक्ष lib का उपयोग कर रहे हैं जो उदा। डेटटाइम टाइपमैक-आइसोलेटियर शायद एक समाधान/वर्कअराउंड। ,

+0

खराब लिंक? पेज नहीं खोल सकता – Kimi

0

मैं एक और सवाल करने के लिए इस उत्तर पोस्ट - http://channel9.msdn.com/blogs/peli/moles-replace-any-net-method-with-a-delegate (जैसे DateTime.Now ;-) दिखाता है कि कैसे एक प्रतिनिधि के साथ किसी भी नेट विधि/संपत्ति को बदलने के लिए):

इसके अलावा माइक्रोसॉफ्ट रिसर्च के Moles/स्टब शांत सामान है लेकिन अगर आप DateTime.Now का परीक्षण करने के लिए एक आसान तरीका ढूंढ रहे हैं तो यह यहां भी लागू होता है।

मुझे जो करना है वह एक सार्वजनिक कार्य है जो उस तिथि में डेटटाइम (Func<DateTime>) देता है, जिसकी वर्तमान दिनांक/समय की आवश्यकता होती है और डिफ़ॉल्ट रूप से डेटटाइम को वापस करने के लिए सेट करें। फिर, परीक्षण के दौरान, मैं इसे एक परीक्षण फ़ंक्शन के साथ ओवरराइट करता हूं जो कि जो भी डेटटाइम मैं परीक्षण करना चाहता हूं उसे देता हूं।

public class MyClass 
{ 
    public Func<DateTime> DateTimeNow =() => DateTime.Now; 

    public void MyMethod() 
    { 
     var currentTime = DateTimeNow(); 
     //... do work 
    } 
} 

public class MyClassTest 
{ 
    public void TestMyMethod() 
    { 
     // Arrange 
     var myClass = new MyClass(); 
     myClass.DateTimeNow =() => new DateTime(1999, 12, 31, 23, 59, 59); 

     // Act 
     myClass.MyMethod(); 

     // Assert 
     // my asserts 
    } 
} 
संबंधित मुद्दे