ฉันใช้ Ruby บน Rails 4 และ rspec-rail gem 2.14 สำหรับอ็อบเจ็กต์ของฉันฉันต้องการเปรียบเทียบเวลาปัจจุบันกับupdated_at
แอ็ตทริบิวต์อ็อบเจ็กต์หลังจากรันแอ็คชันคอนโทรลเลอร์ แต่ฉันมีปัญหาเนื่องจากข้อมูลจำเพาะไม่ผ่าน นั่นคือกำหนดต่อไปนี้เป็นรหัสข้อมูลจำเพาะ:
it "updates updated_at attribute" do
Timecop.freeze
patch :update
@article.reload
expect(@article.updated_at).to eq(Time.now)
end
เมื่อฉันเรียกใช้ข้อมูลจำเพาะข้างต้นฉันได้รับข้อผิดพลาดต่อไปนี้:
Failure/Error: expect(@article.updated_at).to eq(Time.now)
expected: 2013-12-05 14:42:20 UTC
got: Thu, 05 Dec 2013 08:42:20 CST -06:00
(compared using ==)
ฉันจะทำ spec ให้ผ่านได้อย่างไร?
หมายเหตุ : ฉันลองทำสิ่งต่อไปนี้แล้วด้วย (สังเกตการutc
เพิ่มเติม):
it "updates updated_at attribute" do
Timecop.freeze
patch :update
@article.reload
expect(@article.updated_at.utc).to eq(Time.now)
end
แต่ข้อมูลจำเพาะยังไม่ผ่าน (สังเกตความแตกต่างของค่า "got"):
Failure/Error: expect(@article.updated_at.utc).to eq(Time.now)
expected: 2013-12-05 14:42:20 UTC
got: 2013-12-05 14:42:20 UTC
(compared using ==)
===
แทน==
- ขณะนี้คุณกำลังเปรียบเทียบ object_id ของวัตถุ Time สองชิ้นที่ต่างกัน แม้ว่า Timecop จะไม่ตรึงเวลาเซิร์ฟเวอร์ฐานข้อมูล . . ดังนั้นหากการประทับเวลาของคุณถูกสร้างขึ้นโดย RDBMS มันจะไม่ทำงาน (ฉันคิดว่านั่นไม่ใช่ปัญหาสำหรับคุณที่นี่)
===
แต่อาจต้องทนทุกข์ทรมานจากการข้ามขอบเขตที่สอง วิธีที่ดีที่สุดคือการค้นหาหรือเขียนตัวจับคู่ของคุณเองซึ่งคุณจะแปลงเป็นช่วงวินาทีและอนุญาตให้มีความแตกต่างที่แน่นอนเล็กน้อย