Я пытаюсь проверить это after_initialize
обратного вызова, который является для item
модели (которая HAS_MANY line_items
):Rspec, завод девушка и after_initialize
after_initialize :build_default_items, unless: :line_items?
обратного вызова:
def build_default_items
LineOfBusiness.all.each do |lob|
line_items.new(line_of_business_id: lob.id)
end
end
Мой тест выглядит :
describe 'callbacks' do
let(:user) { create :user }
it 'should build default items' do
lob1 = LineOfBusiness.create(id:1, name: "Name1", eff_date: Date.today,exp_date: Date.tomorrow, create_user: user, update_user: user)
lob2 = LineOfBusiness.create(id:2, name: "Name2", eff_date: Date.today,exp_date: Date.tomorrow, create_user: user, update_user: user)
lob_count = LineOfBusiness.all.count # this is correct as 2
item = build :item
expect(item.line_items.count).to eq(lob_count)
end
end
Сообщение об ошибке следующим образом:
expected: 2
got: 0
(compared using ==)
Таким образом, его недостаток в методе обратного вызова, его видя LineOfBusiness.all
как Nil
def build_default_items
LineOfBusiness.all.each do |lob| # <-- this is Nil so fails
line_items.new(line_of_business_id: lob.id)
end
end
Любые идеи, почему его Nil в методе обратного вызова?
Если 'LineOfBusiness' пуст, то' LineOfBusiness.all' дал бы '[]', вместо 'nil' и' each' цикл не должен получить итерацию. –
цикл не проходит, но почему LineOfBusiness пуст? вы правы в том, что цикл не итерируется, но, безусловно, LineOfBusiness.all.count должен быть 2, как в методе тестирования – user3437721
, если вы измените его на 'item = create: item', не имеет значения? – Doon