【问题标题】:how to access has_many models that is created in before clause如何访问在 before 子句中创建的 has_many 模型
【发布时间】:2015-12-27 14:11:56
【问题描述】:

有一个 Companyhas_many QuarterValue,我有一个 RSpec 测试。

  let(:company) { Company.create }
  describe 'company has many quarter values' do
    before do
      10.times { create(:quarter_value, company: company) }
    end
    it 'has 10 quarter values' do
      expect(company.quarter_values.count).to eq(10)
    end
  end

测试通过。我的问题是当我将binding.pry 放在expect 匹配器上方时,我无法访问company.quarter_values,它返回空数组[]

如何使用binding.pry 访问RSpec 测试中的has_many 模型对象?

spec/factories.rb

FactoryGirl.define do
  factory :company do
    sequence(:code) { |n| n + 1000 }
  end
  factory :quarter_value do
    company
  end
end

【问题讨论】:

  • 如果您执行 company.reload 会发生什么?
  • 我制作了一个应用程序来测试这一点,并根据提供的信息复制了所有内容,并且无法复制。当我将 pry 绑定到期望之上,然后在我的控制台中输入 company.quarter_values 它返回所有 10 条记录......而不是一个空数组。这是意料之中的,但与您所说的不符。

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


【解决方案1】:

您需要将代码修改为如下所示:

let(:company) { Company.create }
describe 'company has many quarter values' do
  before do
    10.times { create(:quarter_value, company: company) }
    company.reload
  end
  it 'has 10 quarter values' do
    expect(company.quarter_values.count).to eq(10)
  end
end

您在开始时创建的公司变量不知道它已被赋予任何quarter_values。 您需要调用company.reload 来更新公司与它给出的新关系,因为Company 模型的实例不涉及create(:quarter_value, company: company)

【讨论】:

    【解决方案2】:

    在调试时,您应该在before 块或pry 会话中reload company 对象。

    从数据库中重新加载该对象的属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多