Frage

In Anbetracht der folgenden

class User < ActiveRecord::Base
  has_and_belongs_to_many :companies
end

class Company < ActiveRecord::Base
  has_and_belongs_to_many :users
end

Wie definieren Sie Fabriken für Unternehmen und Anwender einschließlich der bidirektionalen Verein? Hier ist mein Versuch,

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

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

Jetzt versuche ich,

Factory :user

Vielleicht nicht überraschend führt dies zu einer Endlosschleife wie die Fabriken rekursiv sich verwenden, um sie zu definieren.

Noch überraschender habe ich keine Erwähnung gefunden, wie dies überall zu tun, ist es ein Muster, die notwendigen Fabriken für die Definition oder ich tue etwas grundlegend falsch?

War es hilfreich?

Lösung 2

factory da wurde aktualisiert und enthält nun Rückrufe dieses Problem zu lösen. Schauen Sie sich auf http://robots.thoughtbot.com/post / 254496652 / aint-no-calla-back-Mädchen für weitere Informationen.

Andere Tipps

Hier ist die Lösung, die für mich funktioniert.

FactoryGirl.define do

  factory :company do
    #company attributes
  end

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

end

Wenn Sie bestimmte Unternehmen benötigen Sie können auf diese Weise verwenden Fabrik

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

Hope dies für jemanden nützlich sein wird.

Meiner Meinung nach, Erstellen Sie einfach zwei verschiedene Fabriken wie:

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

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

Wenn Sie die Testfälle für Benutzer schreiben dann einfach so schreiben

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

Hoffe, dass es funktionieren wird.

Ich kann nicht ein Beispiel für den oben erwähnten Fall auf der bereitgestellten Website. (Nur 1: N und polymorphe assocations, aber keine HABTM). Ich hatte einen ähnlichen Fall und mein Code sieht wie folgt aus:

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

Was für mich gearbeitet wurde die Assoziation eingestellt wird, wenn die Fabrik mit. Mit Ihrem Beispiel:

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

Achtung: Ändern Benutzer: [user] an: Benutzer => [user] für Ruby 1.8.x

Findet diese Art und Weise schön und ausführliche:

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

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

Als erstes habe ich Sie dringend ermutigen has_many zu nutzen: durch statt HABTM (mehr dazu: hier ), so dass Sie wie am Ende mit etwas:

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

Danach werden Sie has_many Verein auf beiden Seiten haben und sie in factory_girl in der Art und Weise zuordnen können Sie es getan haben.

Update für Rails 5:

Statt has_and_belongs_to_many Assoziation zu verwenden, sollten Sie berücksichtigen:. has_many :through Vereinigung

Der Benutzer Fabrik für diesen Verein sieht wie folgt aus:

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

Sie können die Firma Fabrik in ähnlicher Weise erstellen.

Sobald beide Fabriken eingestellt sind, können Sie user_with_companies Fabrik mit companies_count option erstellen. Hier können Sie festlegen, wie viele Unternehmen der Benutzer gehört: create(:user_with_companies, companies_count: 15)

Sie können ausführliche Erklärung finden über Fabrik Mädchen Verbände hier .

Sie können neues Werk und die Verwendung nach definieren (: create) Rückruf eine Liste der Verbände zu erstellen. Mal sehen, wie es in diesem Beispiel zu tun:

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

Attribut companies_count ist eine vorübergehende und in Attributen der Fabrik und in der Rückruf über den Bewerter. Jetzt können Sie einen Benutzer mit Unternehmen mit der Option erstellen, um festzulegen, wie viele Unternehmen Sie wollen:

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

Für HABTM Ich benutzte Züge und Rückrufe .

Angenommen, Sie haben die folgenden Modelle:

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

Sie können definieren die Fabrik über :

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top