【问题标题】:R Spec Stack level too deep (System Stack Error)R Spec 堆栈级别太深(系统堆栈错误)
【发布时间】:2017-01-18 12:13:37
【问题描述】:

我有三个模型 offer_ticket、event 和 offer,并且下面有三个它们各自的工厂是模型和工厂给定我得到错误 stack level too deep。 有循环执行offer_ticket-to-event,event-to-offer,然后offer-to-offer_tickets 建议我一个解决方案如何消除此错误

offer_Ticket

class Offer Ticket < Active Record::Base
    belongs_to :event
end

事件

class Event < Active Record::Base
   has_many     :offers , dependent: :restrict_with_error
   has_many :offer_tickets , dependent: :restrict_with_error
end

报价

class Offer < Active Record::Base
   has_many :offer_tickets , dependent: :restrict_with_error
   belongs_to :event
end

他们各自的工厂如下所示

offer_tickets

Factory Girl define do
   factory :offer_ticket do
      venue_row_id        1
      sale_id             1
      status              "available"
      seat_number         1
      association(:event)
   end
end

事件

Factory Girl define do
   factory :event do |f|

      f.name { Faker::Name.name  }
      f.starts_at { Faker::Date.backward(Random.rand(20)).to_date }
      f.description { Faker::paragraph }
      after(:build) do |event|
         create(:offer, event: event)
      end
   end
 end

优惠

Factory Girl define do
  factory :offer do
    price                   1
    proxy                   1
    multiple                1
    cancel-others            1
    after(:build) do |offer|
       create(:offer_ticket, offer: offer)
    end
    association(:event)
  end

结束

【问题讨论】:

  • 你能添加导致这种情况的 rspec 吗?

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


【解决方案1】:

最可能的原因可能是您的工厂之间的依赖关系。

假设,您想使用 factory-girl 和问题中提到的工厂创建一个 Event。执行FactoryGirl.create(:event) 将尝试创建Offer(参见事件工厂的:after_build)和...

此报价的创建将触发报价工厂的:after_build,它将尝试创建OfferTicket ...

并且在 offer_ticket 工厂中,它定义了一个association :event,它将再次尝试创建一个Event。因此,这将导致无限循环

我的建议是使用after_build 在您的情况下创建新对象。您可以单独创建它们,然后分配给父对象。如果您提供一些 rspec 代码,它可能会改进我的答案。

【讨论】:

  • 在 offer_ticket_spec 中尝试运行这段代码 offer_ticket = FactoryGirl.create(:offer_ticket)
  • 你能建议我一段代码如何分别创建它们然后分配给父对象
  • 只需从工厂中删除after :build 回调,并使用FactoryGirl.create(:event) 单独创建Event。然后将此事件对象分配给offer_ticketoffer_ticket.event = event
猜你喜欢
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 2012-03-04
  • 2013-10-05
  • 2011-11-17
  • 2012-07-24
相关资源
最近更新 更多