문제

다음을 감안할 때

class User < ActiveRecord::Base
  has_and_belongs_to_many :companies
end

class Company < ActiveRecord::Base
  has_and_belongs_to_many :users
end

양방향 협회를 포함한 회사 및 사용자의 공장을 어떻게 정의합니까? 여기 내 시도가 있습니다

Factory.define :company do |f|
  f.users{ |users| [users.association :company]}
end

Factory.define :user do |f|
  f.companies{ |companies| [companies.association :user]}
end

이제 시도합니다

Factory :user

의심 할 여지없이 공장이 서로를 재귀 적으로 사용하여 스스로를 정의함에 따라 이것은 무한 루프를 초래할 것입니다.

더 놀랍게도 나는 어디서나이 작업을 수행하는 방법에 대한 언급을 찾지 못했습니다. 필요한 공장을 정의하는 패턴이 있습니까? 아니면 근본적으로 잘못된 일을하고 있습니까?

도움이 되었습니까?

해결책 2

FactoryGirl은 그 이후로 업데이트되었으며 이제이 문제를 해결하기위한 콜백이 포함되어 있습니다. 보세요 http://robots.thitceedbot.com/post/254496652/aint-calla-back-girl 더 많은 정보를 위해서.

다른 팁

다음은 저를 위해 작동하는 솔루션입니다.

FactoryGirl.define do

  factory :company do
    #company attributes
  end

  factory :user do
   companies {[FactoryGirl.create(:company)]}
   #user attributes
  end

end

특정 회사가 필요한 경우 이런 식으로 공장을 사용할 수 있습니다.

company = FactoryGirl.create(:company, #{company attributes})
user = FactoryGirl.create(:user, :companies => [company])

이것이 누군가에게 도움이되기를 바랍니다.

제 생각에는 다음과 같은 두 개의 다른 공장을 만듭니다.

 Factory.define :user, :class => User do |u|
  # Just normal attributes initialization
 end

 Factory.define :company, :class => Company do |u|
  # Just normal attributes initialization
 end

사용자의 테스트 사례를 작성하면 이렇게 작성하십시오.

 Factory(:user, :companies => [Factory(:company)])

그것이 효과가 있기를 바랍니다.

제공된 웹 사이트에서 위에서 언급 한 사례에 대한 예를 찾을 수 없었습니다. (단지 1 : N 및 다형성 연관성이지만 HABTM은 없음). 비슷한 경우가 있었고 코드는 다음과 같습니다.

Factory.define :user do |user|
 user.name "Foo Bar"
 user.after_create { |u| Factory(:company, :users => [u]) }
end

Factory.define :company do |c|
 c.name "Acme"
end

저를 위해 일한 것은 공장을 사용할 때 협회를 설정하는 것이 었습니다. 예제 사용 :

user = Factory(:user)
company = Factory(:company)

company.users << user 
company.save! 
  factory :company_with_users, parent: :company do

    ignore do
      users_count 20
    end

    after_create do |company, evaluator|
      FactoryGirl.create_list(:user, evaluator.users_count, users: [user])
    end

  end

경고: 변경 사용자 : [사용자] to : user => [user] Ruby 1.8.x

이런 식으로 멋지고 장점을 발견했습니다.

FactoryGirl.define do
  factory :foo do
    name "Foo" 
  end

  factory :bar do
    name "Bar"
    foos { |a| [a.association(:foo)] }
  end
end

우선 나는 당신이 has_many를 사용하도록 강력히 권장합니다. 여기), 그래서 당신은 다음과 같은 것으로 끝날 것입니다.

Employment belongs_to :users
Employment belongs_to :companies

User has_many :employments
User has_many :companies, :through => :employments 

Company has_many :employments
Company has_many :users, :through => :employments

이 후에는 양쪽에 has_many 연관이 있으며, 당신이 한 방식으로 factory_girl에 그들에게 할당 할 수 있습니다.

레일 5에 대한 업데이트 :

사용하는 대신 has_and_belongs_to_many 협회, 당신은 다음을 고려해야합니다. has_many :through 협회.

이 협회의 사용자 공장은 다음과 같습니다.

FactoryBot.define do
  factory :user do
    # user attributes

    factory :user_with_companies do
      transient do
        companies_count 10 # default number
      end

      after(:create) do |user, evaluator|
         create_list(:companies, evaluator.companies_count, user: user)
      end
    end
  end
end

비슷한 방식으로 회사 공장을 만들 수 있습니다.

두 공장이 모두 설정되면 만들 수 있습니다 user_with_companies 공장 companies_count option. 여기에서 사용자가 속한 회사 수를 지정할 수 있습니다. create(:user_with_companies, companies_count: 15)

자세한 설명을 찾을 수 있습니다 여기 공장 소녀 협회.

새 공장을 정의하고 (: 작성) 콜백을 사용하여 연결 목록을 작성할 수 있습니다. 이 예에서 수행하는 방법을 살펴 보겠습니다.

FactoryBot.define do

  # user factory without associated companies
  factory :user do
    # user attributes

    factory :user_with_companies do
      transient do
        companies_count 10
      end

      after(:create) do |user, evaluator|
        create_list(:companies, evaluator.companies_count, user: user)
      end
    end
  end
end

속성 Companies_Count는 과도이며 공장의 속성과 평가자를 통해 콜백에서 사용할 수 있습니다. 이제 원하는 회사의 수를 지정할 수있는 옵션이있는 회사를 사용하여 사용자를 만들 수 있습니다.

create(:user_with_companies).companies.length # 10
create(:user_with_companies, companies_count: 15).companies.length # 15

HABTM의 경우 특성과 콜백을 사용했습니다.

다음 모델이 있다고 가정합니다.

class Catalog < ApplicationRecord
  has_and_belongs_to_many :courses
  …
end
class Course < ApplicationRecord
  …
end

당신은 할 수 있습니다 위의 공장을 정의하십시오:

FactoryBot.define do
  factory :catalog do
    description "Catalog description"
    …

    trait :with_courses do
      after :create do |catalog|
        courses = FactoryBot.create_list :course, 2

        catalog.courses << courses
        catalog.save
      end
    end
  end
end
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top