FactoryGirl关联模型故障:"SystemStackError:堆栈级别太深" [英] FactoryGirl association model trouble: "SystemStackError: stack level too deep"
问题描述
我正在使用Ruby on Rails 3.0.9,RSpec-rails 2和FactoryGirl.我正在尝试陈述一个Factory关联模型,但是遇到麻烦了.
I am using Ruby on Rails 3.0.9, RSpec-rails 2 and FactoryGirl. I am trying to state a Factory association model but I am in trouble.
我有一个factories/user.rb
文件,如下所示:
I have a factories/user.rb
file like the following:
FactoryGirl.define do
factory :user, :class => User do
attribute_1
attribute_2
...
association :account, :factory => :users_account, :method => :build, :email => 'foo@bar.com'
end
end
和factories/users/account.rb
文件,如下所示:
FactoryGirl.define do
factory :users_account, :class => Users::Account do
sequence(:email) {|n| "foo#{n}@bar.com" }
...
end
end
上面的示例在我的规范文件中按预期工作,但是在factory :users_account
语句中的 if 中,我添加了association :user
代码,以便具有
The above example works as expected in my spec files, but if in the factory :users_account
statement I add the association :user
code so to have
FactoryGirl.define do
factory :users_account, :class => Users::Account do
sequence(:email) {|n| "foo#{n}@bar.com" }
...
association :user
end
end
我收到以下错误:
Failure/Error: Unable to find matching line from backtrace
SystemStackError:
stack level too deep
如何解决该问题,以便从双方\工厂访问关联的模型(也就是说,在我的规格文件中,我想使用Roc关联模型方法,例如user.account
和
How can I solve that problem so to access associated models from both sides\factories (that is, in my spec files I would like to use RoR association model methods like user.account
and account.user
)?
PS:我读了 Factory Girl and has_one 问题,我的案子非常接近链接问题中说明的情况.也就是说,我也有一个has_one
关联(在User
和Users::Account
类之间).
P.S.: I read the Factory Girl and has_one question and my case is very close to the case explained in the linked question. That is, I have an has_one
association too (between User
and Users::Account
classes).
推荐答案
根据文档,您不能仅将关联的双方都放入工厂.您需要使用它们的after回调来设置要返回的对象.
According to the docs, you can't just put both sides of the associations into the factories. You'll need to use their after callback to set an object(s) to return.
例如,在factories/users/account.rb
文件中,您输入类似
For instance, in the factories/users/account.rb
file, you put something like
after(:build) do |user_account, evaluator|
user_account.user = FactoryGirl.build(:user, :account=>user_account)
end
对于has_many关联,您需要使用它们的* _list函数.
For has_many associations, you'll need to use their *_list functions.
after(:build) do |user_account, evaluator|
user_account.users = FactoryGirl.build_list(:user, 5, :account=>user_account)
end
注意:我相信文档中的示例有些误导,它没有为对象分配任何内容.我相信应该是这样(请注意作业).
Note: I believe the example in the docs is a bit misleading it doesn't assign anything to the object. I believe it should be something like (note the assignment).
# the after(:create) yields two values; the user instance itself and the
# evaluator, which stores all values from the factory, including ignored
# attributes; `create_list`'s second argument is the number of records
# to create and we make sure the user is associated properly to the post
after(:create) do |user, evaluator|
user.posts = FactoryGirl.create_list(:post, evaluator.posts_count, user: user)
end
这篇关于FactoryGirl关联模型故障:"SystemStackError:堆栈级别太深"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!