2017-04-04 3 views
0

저장 될 때 상위 사용자의 일부 특성을 업데이트하는 이벤트 모델이 있습니다.FactoryGirl에서 공장을 만들기 전에 부모를 생성하도록하려면 어떻게해야합니까?

class User 
    has_many :events 
end 

class Event 
    belongs_to :user 
    before_save :update_user_attributes 

    validates :user, presence: true 

    def update_user_attributes 
    self.user.update_attributes(hash_of_params) 
    end 
end 

이것은 대부분 잘 작동합니다. 사용자가 존재해야하며 이벤트와 상호 작용하기 전에 로그인해야합니다.

하지만 내 테스트 제품군은 특히 이벤트 팩토리에 문제를 일으키고 있습니다.

FactoryGirl.define do 
    factory :event do 
    user 
    end 
end 

이 실패 update_user_attributes 원인으로 인해 FactoryGirl이 이벤트를 빌드 순서로, 사용자가 이벤트가 생성 될 때 사용할 수없는 것으로 보인다.

이 오류없이

create(:event) 
# ActiveRecord::RecordNotSaved: 
# Failed to save the record 

하지만

build(:event).save 

패스가

내가 오류를 방지 할 수있는 방법의 숫자가 제기되고있다

, 예를 들어,에서 user.persisted? 확인을 의미합니다 update_user_attributes 메서드를 사용하거나 callaback after_save을 실행하십시오. 하지만 제 질문은 특히 FactoryGirl과 관련이 있습니다.

주어진 사실을 감안할 때 이벤트를 만들기 전에 연결된 사용자를 강제로 생성 할 수있는 방법이 있습니까?

답변

0

당신은 FactoryGirl에 콜백을 작성할 수 있습니다 여기에

FactoryGirl.define do 
    factory :event do 
    user 

    before(:create) do |event| 
     create(:user, event_id: event.id) 
    end 
    end 
end 

이벤트가 많은 사용자가있는 경우이 작동

docs link는 또한

+0

감사 @martin FG 콜백에 대한 article on thoughtbot가있다. 하지만 부모를 생성 한 다음 이벤트 팩토리에서 부모의 ID를 작성하는 방법을 알아낼 수는 없습니다. '(create) do self.user_id = create (: user) .id end'와 같이 될 필요가 있습니다. 하지만 올바른 구문을 파악할 수없는 것 같습니다. –

+2

@AndyHarvey,'before (: create) do | event | event.user = create (: user) end'라고 가정합니다. – Ilya

관련 문제