2008-12-12 14 views
6

.NET 3.5 पर NUnit 2.2 का उपयोग करके, निम्न परीक्षण दिनांकटाइम का उपयोग करते समय विफल रहता है। एक्वाल्स। क्यूं कर?डेटटाइम समानता का परीक्षण करते समय यह यूनिट परीक्षण विफल क्यों होता है?

[TestFixture] 
public class AttributeValueModelTest 
{ 
    public class HasDate 
    { 
     public DateTime? DateValue 
     { 
      get 
      { 
       DateTime value; 
       return DateTime.TryParse(ObjectValue.ToString(), out value) ? value : new DateTime?(); 
      } 
     } 

     public object ObjectValue { get; set; } 
    } 

    [Test] 
    public void TwoDates() 
    { 
     DateTime actual = DateTime.Now; 
     var date = new HasDate {ObjectValue = actual}; 
     Assert.IsTrue(date.DateValue.Value.Equals(actual)); 
    } 
} 
+0

बस उत्सुक, किसी भी कारण ?? 2.8 नवीनतम – Perpetualcoder

+0

प्रतीत होता है मैं 2.2 के साथ चिपकने का प्रयास नहीं कर रहा हूं। यह केवल मेरी मशीन पर है क्योंकि यह 2.4 के साथ TestDriven.NET के साथ आया था। मैं क्या खो रहा हूँ? – flipdoubt

उत्तर

14

तिथियां बराबर नहीं हैं। TryParse कुछ ticks छोड़ देता है। टिक मानों की तुलना करें।

Console.WriteLine(date.DateValue.Value.Ticks); 
Console.WriteLine(actual.Ticks); 

पैदावार:

633646934930000000 
633646934936763185 
+0

यह मुझे थोड़ा सा ले गया, लेकिन मैंने दो तिथियों के बीच टाइमस्पेन बनाने के बाद इसे समझ लिया। आपके लिए +1 – flipdoubt

+0

आपको सोचने और जानने के लिए +1 !! – Perpetualcoder

0

अगर यह .NET में एक ही है मैं नहीं जानता, लेकिन जावा में बराबर अक्सर ही तुलना उदाहरणों, एक ही हैं नहीं करता है, तो मान ही कर रहे हैं होगा। आप इसके बजाय तुलना का उपयोग करना चाहते हैं।

+0

नहीं, जावा में, == ऑपरेटर संदर्भ समानता के लिए उपयोग किया जाता है और बराबर() विधि मान समानता के लिए उपयोग की जाती है। –

+0

@Adam: डिफ़ॉल्ट रूप से नहीं। आपके द्वारा वर्णित व्यवहार प्राप्त करने के लिए आपको ऑब्जेक्ट के बराबर विधि को ओवरराइड करना होगा। –

+0

सोवियत रूस में, == ऑब्जेक्ट के बराबर है। –

0
 

public DateTime? DateValue 
     { 
      get 
      { 
       DateTime value; 
       bool isDate = DateTime.TryParse(ObjectValue.ToString(), out value); 
       return isDate ? new DateTime?(value) : new DateTime?(); 
      } 
     } 
 
+0

मैंने कोड नहीं चलाया है। यह पूरी तरह से नज़र पर आधारित है। मुझे खेद है, अगर मैं किसी भी मदद से नहीं हूं। – shahkalpesh

+0

क्षमा करें, लेकिन यह TryParse है कि समस्या है। – flipdoubt

+0

धन्यवाद। जब मैंने कोड को देखा, तो ऐसा लगता है कि डेटटाइम की बजाय डेटटाइम (जब TryParse सफल है) लौट रहा है? एक बात जो मैं यहां सीखता हूं वह यह है कि आप दिनांक समय के लिए डेटटाइम का एक उदाहरण असाइन कर सकते हैं? :) – shahkalpesh

3

समस्या वास्तव में TryParse नहीं है, लेकिन वास्तव में ToString()

एक परीक्षण चलाने के लिए।

एक डेटटाइम ऑब्जेक्ट सटीक (यदि सटीकता नहीं है) के साथ शुरू होता है तो सेकंड के लाखों तक। ToString() एक स्ट्रिंग में परिवर्तित, केवल एक सेकंड के लिए परिशुद्धता के साथ।

TryParse यह दिया जा रहा है के साथ सबसे अच्छा कर रहा है।

यदि आप एक प्रारूप विनिर्देशक ("yyyy-MM-dd HH:mm:ss.ffffff" के आधार पर) जोड़ते हैं, तो इसे काम करना चाहिए।

+0

हम्म, ऑब्जेक्ट। टॉस्ट्रिंग() प्रारूप विनिर्देशक नहीं लेता है। कोई सुझाव? – flipdoubt

1

सभी परिशुद्धता को शामिल करने वाले प्रारूप को निर्दिष्ट करने के लिए, आप String.Format() विधि का उपयोग कर सकते हैं। उदाहरण है कि जेम्स इस प्रकार दिखाई देगा देता है:

String.Format("{0:yyyy-MM-dd HH:mm:ss.ffffff}", ObjectValue); 

मुझे लगता है कि जब आप इसे कुछ है कि एक तारीख नहीं है पारित क्या करेंगे पता नहीं है।

शायद एक सरल तरीका एक विशेष मामले को जोड़ने के लिए जब आप पहले से ही एक तारीख वस्तु मिल गया है है: NUnit 2.2 के लिए चिपके के लिए

public DateTime? DateValue 
    { 
     get 
     { 
      DateTime value = ObjectValue as DateTime; 
      if (value != null) return value; 
      return DateTime.TryParse(ObjectValue.ToString(), out value) ? value : new DateTime?(); 
     } 
    } 
संबंधित मुद्दे