FactoryBot не создает список связанных моделей в обратном вызове после создания - PullRequest
0 голосов
/ 10 октября 2018

У меня есть две фабрики следующим образом:

FactoryBot.define do
  factory :proofread_document do

    factory :proofread_document_with_paragraphs do
      after(:create) {|instance| create_list(:paragraph, 5, proofread_document: instance) }
    end
  end
end

    FactoryBot.define do
      factory :paragraph do
        level { 1 }
        association :proofread_document
    end
end

В моем тесте RSpec:

  describe '#number_of_paragraphs_for' do

    let(:proofread_document) { create(:proofread_document_with_paragraphs)}

    it 'returns the number of paragraphs for the given level' do
      expect(proofread_document.number_of_paragraphs_for("level_1")).to eq(1)
    end
  end

Тест не пройден из-за отсутствия абзацев:

proofead_document.paragraphs
=> []

Почему связанные объекты абзаца не создаются?

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Я нашел проблему.

В моей модели абзацев я поместил область действия по умолчанию следующим образом:

default_scope :minimum_word_count,  ->{ where(proofread_word_count: MINIMUM_LEVEL_DATA_WORD_COUNT..Float::INFINITY)}

Это вызвало некоторые проблемы, так как абзац, который я сохранял в своих тестах, имелслишком малое количество слов для параметров, определенных в этой области.

@P.Boro и @rewritten помогли мне перепроверить мои модели и области.

0 голосов
/ 10 октября 2018

Ассоциации магически не перезагружаются в существующих экземплярах.Это связано не с FactoryBot, а с самой ActiveRecord.

# example with activerecord:

class Foo
  has_many :bars
end

class Bar
  belongs_to :foo
end

foo = Foo.first
foo.bars
# => []
3.times { Bar.create(foo: foo) }
foo.bars
# => []
foo.reload.bars
# => [<#Bar ...>, <#Bar ...>, <#Bar ...>]

Так что вам просто нужно перезагрузить запись (или просто ассоциацию)

after(:create) do |inst|
  create_list(...)
  inst.paragraphs.reload
  # or inst.reload
end
...