2013-10-15 1 views
0

추적하기에 너무 길었던 버그를 발견했습니다.이 두 FactoryGirl 선언의 실제 차이점은 무엇입니까

FactoryGirl.define do 
    factory :global_list do 
    list_id FactoryGirl.create(:user).liked_items_list.id 
    end 
end 

하지만 단지 블록에 싸여 :

FactoryGirl.define do 
    factory :global_list do 
    list_id { FactoryGirl.create(:user).liked_items_list.id } 
    end 
end 

그래서 내가 두 번째 호출에서, 블록이이 같은 실제 호출 될 때까지 실행되지 원인 것을 알고

나는이 있었다 FactoryGirl.create (: global_list)가 만들어졌습니다. 나는 이것이 통과되어 FG를 통해 proc에 덮여 있다고 가정합니다. 다른 실제적인 차이점이 있습니까? 나는 이것을 장황한 모드 등으로 실행하는 방법이 있었으면 좋겠다. 어떤 통찰력

에 대한

들으

답변

1

두 경우 사이의 중요한 차이는 다음과 같습니다

첫 번째 경우에
  1. (NO 블록)에 list_id로 표현이 공장이로드 될 때 평가, 그리고 결코 다시한다 . 팩토리로드시 생성 된 list_id는 팩토리에서 작성된 모든 오브젝트에 사용됩니다. 그래서 모든 global_list 객체들은 같은 list_id를 가질 것입니다.

  2. 두 번째 경우 (블록 포함) list_id 표현식은 팩토리가 호출 될 때마다 평가됩니다 (예 : build (: global_list), create (: global_list)). 표현식으로 인해 생성 된 list_id가 변경되면 다른 팩토리 객체는 서로 다른 list_ids를가집니다.

관련 문제