2009-06-18 2 views
2

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 
+0

, BTW assert_equal의 올바른 사용법은 다음과 같습니다 :
그래서, 당신이 필요로하는 모든 job을 다시로드하는 것입니다 assert_equal (예상, 실제) –

답변

2

그것은 모든 약 협회 캐싱입니다.
1. Factory(:vehicle)vehicle 객체를 구축하고 그 후 job 기록
(2)를 작성하고,이

그러나 vehicle.job 1 단계에서 job 객체를 지적되고있다 vehicle.job_id을 채우고 저장합니다 : 여기 그것이 작동하는 방법

입니다 .

vehicle = Factory(:vehicle) 
vehicle.job.reload.vehicles.size # => 2 
관련 문제