2015-06-02 8 views
9

एक नियंत्रक विधि में मैं उपयोगकर्ता के चर activation_sent_atTime.zone.now के बराबर सेट करता हूं जब उस उपयोगकर्ता को एक सक्रियण ईमेल भेजा जाता है। विकास सर्वर पर यह काम करता प्रतीत होता है (हालांकि मेरे आवेदन में समय अभिव्यक्ति मेरे कंप्यूटर के स्थानीय समय पर 2 घंटे पीछे है)।टाइमविथज़ोन और टाइम.ज़ोन.now एकीकरण परीक्षण

मैं एक एकीकरण परीक्षण शामिल करना चाहता हूं जो परीक्षण करता है कि activation_sent_at वास्तव में ठीक से सेट हो जाता है या नहीं।

assert_equal @user.activation_sent_at, Time.zone.now 

हालांकि, इस त्रुटि का उत्पादन:

No visible difference in the ActiveSupport::TimeWithZone#inspect output. 
You should look at the implementation of #== on ActiveSupport::TimeWithZone or its members. 

मुझे लगता है कि अपने परीक्षण में Time.zone.now के लिए एक और अभिव्यक्ति का उपयोग करने का सुझाव दे रहा है तो मैं लाइन भी शामिल थे। मैंने http://api.rubyonrails.org/classes/ActiveSupport/TimeWithZone.html सहित विभिन्न स्रोतों को देखा है, लेकिन मुझे यकीन नहीं है कि यहां क्या करना है। इस त्रुटि के कारण क्या कोई सुझाव हो सकता है?

अतिरिक्त जानकारी:puts Time.zone.now और puts @stakeholder.activation_sent_at जोड़ा जा रहा है इस बात की पुष्टि दो बराबर हैं। सुनिश्चित नहीं है कि विफलता/त्रुटि उत्पन्न करता है।

उत्तर

20

मुद्दा यह है कि 2 तिथियां एक दूसरे के बहुत करीब हैं लेकिन समान नहीं हैं। आप assert_in_delta

assert_in_delta @user.activation_sent_at, Time.zone.now, 1.second

उपयोग कर सकते हैं लिए RSpec, एक समान दृष्टिकोण be_within उपयोग करने के लिए होगा:

expect(@user.activation_sent_at).to be_within(1.second).of Time.zone.now

2

समस्या यह है कि अपने समय के बहुत करीब है, लेकिन काफी बराबर नहीं हैं। वे शायद एक सेकंड के कुछ अंशों से दूर हैं।

इस तरह के मुद्दों का एक समाधान एक परीक्षण मणि है जिसे timecop कहा जाता है। यह आपको Time.now पर नकल करने की क्षमता देता है ताकि यह अस्थायी रूप से एक विशिष्ट मान लौटाए जिसे आप तुलना के लिए उपयोग कर सकते हैं।

+0

मजेदार है, टाइमकॉप पहला उद्धारकर्ता था जिसे मैंने सोचा था जब मुझे इस मुद्दे का सामना करना पड़ा, फिर भी इससे मदद नहीं मिली। मजेदार। – bbozo

+0

मुद्दा यह है कि यदि आप समय जमा करते हैं, तो यह मदद नहीं करता है - शायद कुछ infinitesimal बहाव के कारण जो भी अंकगणित खेल पर है विश्वसनीय रूप से तुलना नहीं कर सकते हैं। हालांकि, जब मैंने मिलीसेकंड के साथ अपने चयन के एक विशेष पल में समय निर्धारित किया, तो यह काम करता है, यानी 'टाइमकॉप.फ्रीज' विफल रहता है और 'टाइमकॉप.फ्रीज़ टाइम.परसे ("2016-09-13 18:26 : 09 +0200 ") 'काम करता है' – bbozo

+0

यदि आप उत्तर अपडेट करते हैं, तो मैं +1 – bbozo

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