Mam następujący kod, w którym tworzę kilka wystąpień rekordów za pomocą 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
Z mojego podważnego punktu otrzymuję następujące informacje:
LabCollectionInclusion.count
=> 0
lab_collection_1.lab_collection_inclusions.count
=> 0
Kiedy następnie wywołuję rekord indywidualnie, wydaje się, że istnieje:
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>
Od tego momentu istnieje podczas wyszukiwania:
LabCollectionInclusion.count
=> 1
lab_collection_1.lab_collection_inclusions.count
=> 1
Oczywiście nie chcę tego robić dla każdego rekordu, więc moje 2 pytania to po pierwsze, dlaczego tak się dzieje, a po drugie, jak to poprawić?
Z góry dziękuję
1 odpowiedź
Jest to oczekiwane zachowanie, ponieważ let
a> jest przeznaczony do leniwej oceny. Cytat z dokumentacji let
a>:
Zauważ, że
let
jest oceniany z opóźnieniem: nie jest oceniany, dopóki nie zostanie wywołana zdefiniowana przez niego metoda. Możesz użyćlet!
, aby wymusić wywołanie metody przed każdym przykładem.
Jak opisano w dokumentacji: Po prostu let!
(zwróć uwagę na !
) zamiast let
, gdy chcesz utworzyć rekordy bez uprzedniego wywoływania ich po imieniu.
Podobne pytania
Nowe pytania
ruby-on-rails
Ruby on Rails to framework aplikacji internetowych typu open source z pełnym stosem, napisany w języku Ruby. Opiera się na popularnym modelu frameworkowym MVC i jest znany ze swojego podejścia do tworzenia aplikacji „konwencja zamiast konfiguracji”.