FactoryGirl关联模型故障:"SystemStackError:堆栈级别太深" [英] FactoryGirl association model trouble: "SystemStackError: stack level too deep"

查看:53
本文介绍了FactoryGirl关联模型故障:"SystemStackError:堆栈级别太深"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用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关联(在UserUsers::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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆