Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 工厂女工协会模特儿麻烦:“;SystemStackError:堆栈级别太深“;_Ruby On Rails_Ruby_Ruby On Rails 3_Rspec_Factory Bot - Fatal编程技术网

Ruby on rails 工厂女工协会模特儿麻烦:“;SystemStackError:堆栈级别太深“;

Ruby on rails 工厂女工协会模特儿麻烦:“;SystemStackError:堆栈级别太深“;,ruby-on-rails,ruby,ruby-on-rails-3,rspec,factory-bot,Ruby On Rails,Ruby,Ruby On Rails 3,Rspec,Factory Bot,我正在使用RubyonRails3.0.9、RSpecRails2和FactoryGirl。我试图陈述一个工厂协会模型,但我遇到了麻烦 我有一个factories/user.rb文件,如下所示: FactoryGirl.define do factory :user, :class => User do attribute_1 attribute_2 ... association :account, :factory => :users_acc

我正在使用RubyonRails3.0.9、RSpecRails2和FactoryGirl。我试图陈述一个工厂协会模型,但我遇到了麻烦

我有一个
factories/user.rb
文件,如下所示:

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
FactoryGirl.define do
  factory :users_account, :class => Users::Account do
    sequence(:email) {|n| "foo#{n}@bar.com" }
    ...
  end
end
factories/users/account.rb
文件,如下所示:

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
FactoryGirl.define do
  factory :users_account, :class => Users::Account do
    sequence(:email) {|n| "foo#{n}@bar.com" }
    ...
  end
end
上面的示例在我的spec文件中按预期工作,但是如果在
工厂:用户\u帐户
语句中,我添加了
关联:用户
代码,以便

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
如何解决该问题,以便从双方\工厂访问关联模型(也就是说,在我的规范文件中,我想使用RoR关联模型方法,如
user.account
account.user

注:我读了这个问题,我的案例与相关问题中解释的案例非常接近。也就是说,我有一个
也有一个
关联(在
用户
用户::帐户
类之间)。

根据,你不能将关联的双方都放入工厂。您需要使用其after回调来设置要返回的对象

例如,在
factories/users/account.rb
文件中

after(:build) do |user_account, evaluator|
    user_account.user = FactoryGirl.build(:user, :account=>user_account)
end
对于多个关联,您需要使用它们的*\列表函数

after(:build) do |user_account, evaluator|
    user_account.users = FactoryGirl.build_list(:user, 5, :account=>user_account)
end

注意:我相信文档中的示例有点误导,它没有为对象分配任何内容。我认为应该是(注意作业)

Spyle的优秀答案(仍在使用Rails 5.2和RSpec 3.8)将适用于大多数协会。我有一个用例,其中一个工厂需要使用两个不同的工厂(或不同的特性)来实现一个has_多个关联(即范围类型方法)

我最后想到的是:

# To build user with posts of category == 'Special' and category == 'Regular'
after(:create) do |user, evaluator|
  array = []
  array.push(FactoryBot.create_list(:post, 1, category: 'Regular')
  array.push(FactoryBot.create_list(:post, 1, category: 'Special')
  user.posts = array.flatten
end

这允许用户有一个“常规”类帖子和一个“特殊”类帖子。

只是好奇,你有一个
用户
,然后你有一个
用户::帐户
,这应该是复数还是应该是
用户::帐户
或打字错误?@kwon-这不是打字错误。我有一个
Users::Account
类。