我有以下代码,在这些代码中我使用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
很显然,我不想为每条记录都这样做,所以我的两个问题首先是为什么会发生这种情况,其次是如何纠正它?
预先感谢
答案 0 :(得分:4)
这是预期的行为,因为let
旨在进行延迟求值。引用docs of let
:
请注意,
let
是惰性求值的:只有在第一次调用它定义的方法时才对其求值。您可以使用let!
在每个示例之前强制调用该方法。
如文档中所述:当您需要创建记录而无需先按其名称调用它们时,只需let!
(请注意!
)而不是let
。