2015-11-16 2 views
0

Я пытаюсь проверить это 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 в методе обратного вызова?

+0

Если 'LineOfBusiness' пуст, то' LineOfBusiness.all' дал бы '[]', вместо 'nil' и' each' цикл не должен получить итерацию. –

+0

цикл не проходит, но почему LineOfBusiness пуст? вы правы в том, что цикл не итерируется, но, безусловно, LineOfBusiness.all.count должен быть 2, как в методе тестирования – user3437721

+0

, если вы измените его на 'item = create: item', не имеет значения? – Doon

ответ

0

line_items.count отправляет запрос в базу данных, а поскольку вы не сохраняете line_items в after_initialize callback, спецификация не удастся. Вместо этого попробуйте использовать line_items.size.

expect(item.line_items.size).to eq(lob_count) 
Смежные вопросы