Я новичок в 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
Благодаря @Eric для быстрого ответа, но тест по-прежнему не удался после того, как сохранился 'current_item', есть ли другой способ переписать спецификацию для выполнения того же теста? –
Уверен, что вы можете сделать '@ cart.add_product (@ product.id) .quantity.should eq 2 Проблема с этим подходом заключается в том, что он не проверяет, сохранялся ли ваш предмет таким образом. Это просто проверяет, работает ли ваша логика. –
Я просто хотел протестировать логику, у меня предмет сохранился на другой части моего кода, я буду проверять, как он сохраняется в этой части. ваш ответ - это то, что я искал. –