【问题标题】:Rspec and FactoryGirl: SystemStackError: stack level too deep railsRspec 和 FactoryGirl: SystemStackError: stack level too deep rails
【发布时间】:2018-03-18 16:27:23
【问题描述】:

我有一个规格和一个工厂,但我收到了这个错误:

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

当我尝试使用动词“构建”时,它会起作用;但我需要将它保存到测试数据中,并且“创建”在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

【问题讨论】:

  • 请出示您的User 型号。里面有没有回调,比如after_createafter_commit等?
  • 规范用户模型或应用程序一
  • 模型来自app/models
  • 好吧,我确实有 3 个 after_create、3 个 before_create 和 1 个 after_save。我无法在此处发布整个模型,这些回调如何导致 rspec/factorygirl 出现问题?
  • 如果您正在这样做,您不应该这样做。您可以在此处发布回调以获得更好的反馈。

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


【解决方案1】:

这个错误一般发生在你不小心递归的时候 改变一个属性。如果您在用户模型中有用户名属性, 和一个名为 username 的虚拟属性,它直接改变 用户名,你最终调用虚拟,虚拟调用 虚拟又等等。。所以,看看有没有东西 就像你代码中的某个地方发生的那样。

Stack level too deep error in Ruby on Rails

【讨论】:

    【解决方案2】:

    要建立关联,您只需调用工厂名称即可:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-04
      • 2015-07-03
      • 2017-08-06
      • 2011-08-22
      • 1970-01-01
      相关资源
      最近更新 更多