Я пишу юнит-тесты для приложения shopping_cart. Содержит элементы user, order, order_item и product.
Я написал следующую спецификацию, где общая цена купленных предметов хранится в атрибуте total
заказа: order_spec.rb
describe '#total_price' do
before(:each) do
user = User.new(email: 'test1@example.com', password: 'test1234')
@order = Order.new(user: user)
@order_item = OrderItem.new(order: @order, unit_price: 100, quantity: 2,
total_price: 200)
end
it 'calculates order total price' do
expect(@order.total).to eql(200)
end
end
Таблица заказов содержит следующие атрибуты:
Заказ (id, всего, user_id)
Однако при запуске спецификации выдает ошибку как:
1) Order Instance Methods #total_price does something
Failure/Error: expect(@order.total).to eql(900)
expected: 900
got: 0.0
(compared using eql?)
Модель заказа связана со многими элементами order_items и принадлежит одному пользователю.
Код для модели заказа выглядит следующим образом:
class Order < ApplicationRecord
belongs_to :user, optional: true
has_many :order_items
before_save :update_total
def total_price
price = order_items.collect do |order_item|
order_item.item_unit_price * order_item.quantity
end
price.sum
end
private
def update_total
self[:total] = total_price
end
end
Может кто-нибудь сказать мне, почему он не сохраняет итоги? Это хранит пользователя, но не итоги. Что я делаю не так?
Я использую rspec и капибару для тестирования.
Пожалуйста, помогите.
Заранее спасибо.