Rails / Rspec - объекты не существуют до тех пор, пока они не взаимодействуют с - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть следующий код, где я создаю несколько экземпляров записей с использованием 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

Очевидно, что я не хочу делать это для каждой записи, поэтому мои 2 вопроса - это, во-первых, почему это происходит, и, во-вторых, как это исправить?

Заранее спасибо

1 Ответ

0 голосов
/ 01 ноября 2018

Это ожидаемое поведение, потому что let рассчитано на ленивую оценку. Цитата из документов let:

Обратите внимание, что let вычисляется лениво: оно не оценивается, пока в первый раз не будет вызван метод, который он определяет. Вы можете использовать let! для принудительного вызова метода перед каждым примером.

Как описано в документации: просто let! (обратите внимание на !) вместо let, когда вам нужно создать записи, не называя их по имени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...