Anton가 지적한 것처럼 (Anton에게 감사드립니다!) 내 문제는 테스트에서 Association Caching이며 Factory에서 nested_attribute를 올바르게 작성한 것처럼 보입니다. 올바른 구문은 다음과 같습니다 내 작업 모델 accepts_nested__attributes_for
을 사용하고 이후 거의 내 구슬 "고정 다이빙"나는 모델을 변경할 때마다 잃고 공장 소녀로 마이그레이션하려고accepts_nested_attributes_for를 사용하여 RoR Factory 연결을 어떻게 생성합니까?
Factory.define :job do |f|
...
f.vehicles_attributes [{:vin => "1", :model => "ford", :make => "escort"},{:vin => "1", :model => "ford", :make => "escort" }]
end
.
나는 아래 코드의 무리를 게시하지만 내 질문은 간단하다 :내가 nested_attributes를 만드는 공장을 어떻게 사용합니까?
아래 코드를 사용하여 Job 인스턴스를 만들 수 있지만 유닛 테스트에서 자동차를 만들 수 없습니다. f.vehicles_attributes...
이 없으면 작업 테스트가 유효하지 않습니다.
내 단위 테스트는 다음과 같은 결과를 생산 :
test "factory" do
job = Factory(:job)
assert(job.valid?) # => true
assert(job.vehicles.first.valid?) # => true
vehicle = Factory(:vehicle)
assert(vehicle.job.vehicles.size == 1) # => true
assert_equal(vehicle.job.vehicles.first.vin, "2") # => FALSE. <"1"> expected but was <"2">
end
Factory.define :job do |f|
...
f.vehicles_attributes [:vin => "1", :model => "ford", :make => "escort" ]
end
Factory.define :vehicle do |f|
f.vin "2"
f.model "ford"
f.make "escort"
f.association :job
end
class Job < ActiveRecord::Base
has_many :vehicles, :dependent => :destroy
validate :job_must_have_at_least_one_vehicle
accepts_nested_attributes_for :vehicles, :allow_destroy => :true, :reject_if => proc { |vehicle_attributes| Job.insufficient_vehicle_input?(vehicle_attributes) }
def job_must_have_at_least_one_vehicle
errors.add(:vehicles, "need to be added") if self.vehicles.empty?
end
def self.insufficient_vehicle_input?(vehicle_attributes)
vehicle_property_keys = vehicle_attributes.keys
vehicle_property_keys.delete('_delete')
vehicle_property_keys.delete('is_operational')
vehicle_property_keys.delete('has_keys')
vehicle_property_keys.each do |attribute_to_validate|
if(!vehicle_attributes[attribute_to_validate].nil? && !vehicle_attributes[attribute_to_validate].empty?)
return false
end
end
return true
end
end
, BTW assert_equal의 올바른 사용법은 다음과 같습니다 :
그래서, 당신이 필요로하는 모든
job
을 다시로드하는 것입니다 assert_equal (예상, 실제) –