Rails / Rspec-与对象交互之前不存在的对象

时间:2018-11-01 10:53:58

标签: ruby-on-rails ruby rspec

我有以下代码,在这些代码中我使用FactoryBot创建了一些记录实例:

describe "#force_recalculation_of_lab_container_labs" do
  (1..5).each do |n|
    let("lab_#{n}".to_sym) { create(:lab) }
    let("lab_container_#{n}".to_sym) { create(:skill_path) }
    let("lab_collection_#{n}".to_sym) do
      create(:lab_collection, lab_container: eval("lab_container_#{n}"))
    end
  end
  context 'when adding labs' do
    it "starts with 0 labs" do
      expect(lab_collection_1.labs.count).to eq(0)
    end
    (1..3).each do |n|
      let("lab_collection_inclusion_#{n}") do
        create(:lab_collection_inclusion,
          included_item_id: eval("lab_#{n}").id,
          included_item_type: 'Lab',
          lab_collection_id: eval("lab_collection_1").id,
          subscribed: 0)
      end
    end
    it "updates the lab total correctly after adding labs" do
      binding.pry
    end
  end
end

从撬开点,我收到以下信息:

LabCollectionInclusion.count
=> 0

lab_collection_1.lab_collection_inclusions.count
=> 0

当我分别调用记录时,它似乎存在:

lab_collection_inclusion_1
<LabCollectionInclusion:0x000055a45c985b10
 id: 1,
 included_item_id: 1,
 included_item_type: "Lab",
 lab_collection_id: 4,
 subscribed: false,
 created_at: Thu, 01 Nov 2018 10:48:00 UTC +00:00,
 updated_at: Thu, 01 Nov 2018 10:48:00 UTC +00:00>

搜索时存在该点:

LabCollectionInclusion.count
=> 1

lab_collection_1.lab_collection_inclusions.count
=> 1

很显然,我不想为每条记录都这样做,所以我的两个问题首先是为什么会发生这种情况,其次是如何纠正它?

预先感谢

1 个答案:

答案 0 :(得分:4)

这是预期的行为,因为let旨在进行延迟求值。引用docs of let

  

请注意,let是惰性求值的:只有在第一次调用它定义的方法时才对其求值。您可以使用let!在每个示例之前强制调用该方法。

如文档中所述:当您需要创建记录而无需先按其名称调用它们时,只需let!(请注意!)而不是let