如何在Factory Girl中创buildhas_and_belongs_to_many关联
鉴于以下
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
也许毫不奇怪的是,当工厂recursion地使用彼此来定义自己时,这导致无限循环。
更令人惊讶的是,我还没有发现如何在任何地方做到这一点,有没有一种模式来定义必要的工厂,或者我正在做一些根本性的错误?
这是适合我的解决scheme。
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])
希望这对别人有帮助。
Factorygirl已经更新,现在包括callback来解决这个问题。 看看http://robots.thoughtbot.com/post/254496652/aint-no-calla-back-girl了解更多信息。;
在我看来,只需创build两个不同的工厂,如:
Factory.define:user,:class => User do | u | #只是正常的属性初始化 结束 Factory.define:company,:class => Company do | u | #只是正常的属性初始化 结束
当你为用户编写testing用例时,就像这样写
工厂(:用户,:公司=> [工厂(:公司)])
希望它能工作。
我无法在提供的网站上find上述案例的例子。 (只有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
警告:对于ruby 1.8.x,将用户:[user]更改为:users => [user]
首先,我强烈build议你使用has_many:而不是habtm(更多关于这个),所以你最终会得到如下结果:
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分配给他们。
发现这种方式很好,详细:
FactoryGirl.define do factory :foo do name "Foo" end factory :bar do name "Bar" foos { |a| [a.association(:foo)] } end end