在Rails(3.0)測試代碼中,我克隆了一個對象,因此我可以在不更改原始的情況下對其進行驗證測試。如果我在克隆之前調用了assert(original.valid?),那麼即使在我將member_id值設置爲nil之後,克隆也會通過validates_presence_of測試。Rails3:克隆已驗證的對象可以防止克隆無效 - 這是奇怪還是正常?
下面的兩個測試說明了這一點。在測試一中,在之前創建了克隆,原始(「聯繫」)被驗證。當member_id缺失時,克隆正確地失敗了驗證。斷言C成功。
在測試二中,克隆創建後原始驗證。即使clone.member_id設置爲零,它通過驗證。換句話說,斷言2C失敗。在測試之間的唯一差異是兩條線的順序:
cloned = contact.clone
assert(contact.valid?,"A")
這到底是怎麼回事?這是正常的Ruby行爲:克隆我只是不明白?
test "clone problem 1" do
contact = Contact.new(:member_id => 1)
cloned = contact.clone
assert(contact.valid?,"A")
cloned.member_id = nil
assert(!cloned.valid?,"C")
end
test "clone problem 2" do
contact = Contact.new(:member_id => 1)
assert(contact.valid?,"2A")
cloned = contact.clone
cloned.member_id = nil
assert(!cloned.valid?,"2C")
end
我忘了提及,在測試2中,我使用assert(!cloned.member_id)檢查以確保cloned.member_id在賦值之後爲零。它是零,但仍然通過驗證。 – 2010-09-26 23:01:11