2010-04-28 11 views
35

मेरी सी # इकाई परीक्षण निम्न कथन है:क्यों डेटाटाइम तुलना नहीं कर सकता है?

Assert.AreEqual(logoutTime, log.First().Timestamp); 

क्यों यह निम्नलिखित जानकारी के साथ विफल रहा है:

Assert.AreEqual failed. Expected:<4/28/2010 2:30:37 PM>. Actual:<4/28/2010 2:30:37 PM>. 

वे एक ही नहीं कर रहे हैं?

अद्यतन:

उपयोग इस अगर आप केवल दूसरे के लिए परवाह:

Assert.AreEqual(logoutTime.ToString(), log.First().Timestamp.ToString());

+12

क्या आप वाकई दो मान बराबर हैं? शायद मिलीसेकंद भागों अलग हैं? – dtb

+1

देखें http://stackoverflow.com/questions/364055/why-does-this-unit-test-fail-when-testing-datetime- स्पष्टता से तारीखें बराबर होती हैं जबकि इसका मतलब यह नहीं है कि वे बराबर हैं टिक – Rangoric

उत्तर

41

आपने जांच लिया है कि टिक/मिलीसेकेंड की संख्या बराबर हैं?

आप DateTime.Now() करते हैं दो बार वापस वापस करने के लिए, वे एक ही नंबर मिनट के लिए नीचे और शायद भी दूसरा करने के लिए नीचे होने के लिए दिखाई देगा, लेकिन वे अक्सर टिक द्वारा अलग अलग होंगे। यदि आप केवल मिनट के लिए समानता की जांच करना चाहते हैं, तो प्रत्येक दिनांक समय की तुलना केवल उस डिग्री तक करें। गोलाई datetimes पर जानकारी के लिए, here


A note about resolution देखें:

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

1

क्या आप सुनिश्चित हैं कि लॉगआउटटाइम और लॉग। फर्स्ट()। टाइमस्टैम्प दोनों को डेटटाइम के रूप में टाइप किया जाता है?

यदि ऐसा है, तो उनके पास अधिक विशिष्ट समय जानकारी (उदा।, मिलीसेकंड) के लिए अलग-अलग मान भी हो सकते हैं। जैसे Assert.AreEqual(logoutTime.Ticks, log.First().Timestamp.Ticks)

0

कोशिश कुछ मैं Assert.AreEqual<T>Object.Equals() का उपयोग करता है वस्तुओं नहीं लेकिन मूल्यों की समानता निर्धारित करने के लिए लगता है।

शायद यह कथन दो विभिन्न वस्तुओं की तुलना कर रहा है और इसलिए झूठी वापसी कर रहा है। ।

+0

जॉन स्कीट ने जेलेच के जवाब पर कहा: "अपवाद संदेश में टिकों के विभिन्न मूल्यों को दिखाने के अलावा यह वही काम करेगा।" – Dinah

+0

बिल्कुल, इसलिए यह आपको दिखाएगा कि दो मान बराबर क्यों नहीं हैं। – Germ

0

यह मानते हुए कि logoutTime और log.First() समय-चिह्न प्रकार दिनांक समय के दोनों कर रहे हैं, तो आप इस के बजाय का उपयोग कर प्रयास करना चाहिए:

Assert.AreEqual(logoutTime.Ticks, log.First().Timestamp.Ticks); 
+1

अपवाद संदेश में टिकों के विभिन्न मान दिखाने के अलावा, वही वही काम करेगा। –

3

जोर असफल विधि शायद दिनांक समय जो एक छोटा रिटर्न पर ToString() बुला रहा है , मिलीसेकंड घटक के बिना तारीख का मानव-पठनीय रूप। यही कारण है कि ऐसा प्रतीत होता है कि वे बराबर हैं, वास्तव में, डेटटाइम ऑब्जेक्ट में 100-नैनोसेकंड इकाई (Tick के रूप में जाना जाता है) की सटीकता है। इसका मतलब है कि यह बहुत ही असंभव है कि दो डेटटाइम ऑब्जेक्ट्स का सटीक वही मूल्य होगा। तुलना करने के लिए शायद आप मूल्य की कमी को कम करना चाहते हैं, शायद आपको आवश्यक निष्ठा की तारीख को स्वरूपित करके।

1

इकाई की रूपरेखा का उपयोग करना, यदि आप डेटाबेस .AsNoTracking()DateTime संपत्ति का उपयोग कर यदि मूल मूल्य स्मृति में अब भी है, इसलिए थोड़ा कभी पूर्णांकित कर दिया जाएगा, जबकि यह जरूरी .AsNoTracking() बिना गोल नहीं होगा से ला नहीं। इस प्रकार डेटाबेस के लिए एक राउंड-ट्रिप शामिल एकीकरण परीक्षण के लिए, मुझे लगता है कि .ToString() का उपयोग करना सबसे अच्छा है क्योंकि डेटाबेस परिशुद्धता को कम करेगा।

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