Rspec和FactoryGirl:SystemStackError:堆栈级别太深的rails

时间:2017-10-06 19:45:33

标签: ruby-on-rails ruby rspec factory-bot

我有一个规格和一个工厂,我收到此错误:

SystemStackError: stack level too deep
    from gems/activerecord-4.2.1/lib/active_record/relation/delegation.rb:9:in `relation_delegate_class'    

当我尝试使用verbage'build'时,它可以工作;但是我需要它来保存测试数据并且“创建”在let!(:user) { create(:user) }中不起作用,因为它会引发该错误。 Rspec似乎工作正常。

我正在运行ruby 2.2.2;使用rspec和工厂女孩

require 'spec_helper'
describe API::V1::CurrentUserController do
   let!(:user) { create(:user) }
    setup_api_authorization

   describe "GET 'show'" do
    before (:each) do
    setup_api_headers
    get 'show', subdomain: 'api', id: 'me'
   end
end


FactoryGirl.define do
  factory :user, aliases: [:participant] do
    sequence(:email) { |n| "user#{n}@example.com" }
    first_name { Faker::Name.first_name }
    last_name { Faker::Name.last_name }
    password 'testpass'
    password_confirmation { |user| user.password }
    role_id {4}
 end
end

2 个答案:

答案 0 :(得分:0)

要设置关联,您只需调用工厂名称:

FactoryGirl.define do
  factory :user, aliases: [:participant] do
    sequence(:email) { |n| "user#{n}@example.com" }
    first_name { Faker::Name.first_name }
    last_name { Faker::Name.last_name }
    password 'testpass'
    password_confirmation { password  }
    role
  end
end

永远不要将ID硬编码到您的工厂 - 您只是为自己创造了一个受伤的世界。

如果您使用的是Rolify,则可以使用回调向用户添加角色:

FactoryGirl.define do
  factory :user, aliases: [:participant] do
    sequence(:email) { |n| "user#{n}@example.com" }
    first_name { Faker::Name.first_name }
    last_name { Faker::Name.last_name }
    password 'testpass'
    password_confirmation { password }
    after(:create) { |user| user.add_role(:peasant) }
  end
end

答案 1 :(得分:0)

  

当您意外递归时,通常会发生此错误   更改属性。如果您在用户模型中有用户名属性,   以及一个名为username的虚拟属性,它直接改变了   用户名,你最终调用虚拟,虚拟调用   虚拟再次等等。因此,看看是否有事   就像在你的代码中某处发生的那样。

documentation