FactoryBot未在创建后回调中创建关联的模型列表

时间:2018-10-10 08:58:32

标签: ruby rspec factory-bot

我有两个工厂,如下所示:

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 :(得分:0)

我发现了问题。

在我的段落模型中,我将默认范围如下:

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

这引起了一些问题,因为我在测试中保存的段落的字数太少,无法定义此范围内的参数。

@ P.Boro和@rewrite帮助我重新检查了模型和范围。

答案 1 :(得分:-1)

关联不会在现有实例上神奇地重新加载。这不是由于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