0

Я новичок в Rspec и FactoryGirl для тестирования приложений ROR. Я пытаюсь проверить метод класса модели add_product(product_id), и он продолжает терпеть неудачу, хотя он работает, когда я пытаюсь использовать его в браузере. вот код модели:Тестирование метода класса для модели с использованием Rspec и FactoryGirl в Rails

class Cart < ActiveRecord::Base 
    has_many :line_items, inverse_of: :cart 

    def add_product(product_id) 
    current_item = line_items.find_by_product_id(product_id) 
    if current_item 
     current_item.quantity += 1 
    else 
     current_item = line_items.build(:product_id => product_id) 
    end 
    current_item 
    end 
end 

Вот неисправная спецификация для тележки модели:

describe Cart do 
    before(:each) do 
    @cart = FactoryGirl.create(:cart) 
    @product = FactoryGirl.create(:product) 
    @line_item = FactoryGirl.create(:line_item, product_id: @product.id, cart_id: @cart.id) 
    end 
    it 'increases the quantity of line_item when a similar product is added' do 
    lambda {@cart.add_product(@product.id)}.should change {@line_item.quantity}.by(1) 
    end 
end 

Это терпит неудачу, и я получаю сообщение от Rspec Failure/Error: lambda {@cart.add_product(@product.id)}.should change {@line_item.quantity}.by(1) result should have been changed by 1, but was changed by 0

ответ

0

Количества в настоящее время обновляется, но вы никогда не сохраняете данные. Таким образом, данные никогда не попадают в базу данных, и тест никогда не увидит изменения. Вы столкнетесь с той же проблемой с .build, где она не сохраняется, пока вы прямо не скажете об этом. Вы можете это изменить.

class Cart < ActiveRecord::Base 
    has_many :line_items, inverse_of: :cart 

    def add_product(product_id) 
    current_item = line_items.find_by_product_id(product_id) 
    if current_item 
     current_item.quantity += 1 
     current_item.save 
    else 
     current_item = line_items.create(:product_id => product_id) 
    end 
    current_item 
    end 
end 
+0

Благодаря @Eric для быстрого ответа, но тест по-прежнему не удался после того, как сохранился 'current_item', есть ли другой способ переписать спецификацию для выполнения того же теста? –

+1

Уверен, что вы можете сделать '@ cart.add_product (@ product.id) .quantity.should eq 2 Проблема с этим подходом заключается в том, что он не проверяет, сохранялся ли ваш предмет таким образом. Это просто проверяет, работает ли ваша логика. –

+0

Я просто хотел протестировать логику, у меня предмет сохранился на другой части моего кода, я буду проверять, как он сохраняется в этой части. ваш ответ - это то, что я искал. –

Смежные вопросы