В тестовом коде Rails (3.0) я клонировал объект, чтобы я мог скрыть его для проверки проверки без изменения оригинала. Если я вызвал assert (original.valid?) перед клонированием, то клон передает проверку validates_presence_of даже после того, как я установил значение member_id равным nil.Rails3: клонирование уже проверенного объекта предотвращает недействительность клонирования - это странно или нормально?
Следующие два примера иллюстрируют это. В тестовой версии клон создается до. Оригинал («контакт») проверяется. Клонировать правильно не удалось проверить, когда отсутствует член_и_ид. Утверждение C преуспевает.
В испытании два, клон создан после оригинал валидирован. Несмотря на то, что clone.member_id установлен на ноль, он передает валидацию. Другими словами, утверждение 2C терпит неудачу. только разница между тестами является порядок двух линий:
cloned = contact.clone
assert(contact.valid?,"A")
Что здесь происходит? Является ли это обычным рубиновым поведением re: клонирование, которое я просто не понимаю?
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 я проверил, чтобы cloned.member_id был нулем после назначения, используя assert (! Cloned.member_id). Это _is_ ноль, но все еще проходит проверку. –