Dans le code de test Rails (3.0), j'ai cloné un objet afin que je puisse l'écraser pour des tests de validation sans changer l'original. Si j'ai appelé assert (original.valid?) avant le clonage, le clone passe le test validates_presence_of même après avoir défini la valeur de member_id sur nil.Rails3: Le clonage d'un objet déjà validé empêche l'invalidation du clone - est-ce étrange ou normal?
Les deux tests ci-dessous illustrent cela. Dans le premier test, le clone est créé avant que l'original ("contact") soit validé. Cloner échoue correctement la validation lorsque member_id est manquant. L'assertion C réussit.
Dans le test 2, le clone est créé après l'original est validé. Même si clone.member_id est défini sur nul, transmet la validation. En d'autres termes, l'assertion 2C échoue. La seule différence entre les essais est l'ordre des deux lignes:
cloned = contact.clone
assert(contact.valid?,"A")
ce qui se passe ici? Est-ce que ce comportement normal de Ruby est: le clonage que je ne comprends pas?
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
J'ai oublié de mentionner que, dans le test 2, j'ai vérifié pour être sûr que cloned.member_id était nul après l'affectation, en utilisant assert (! Cloned.member_id). Il est nul, mais passe toujours la validation. –