我有两个工厂,如下所示:
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
=> []
为什么不创建关联的段落对象?
答案 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