Обновление ActiveRecord в тесте Rails - PullRequest
0 голосов
/ 05 июля 2011

Я пишу свое первое приложение Rails 'Store' и сталкиваюсь с чем-то странным в одном из моих тестов. Я пытаюсь протестировать метод add_product на cart.rb:

    class Cart < ActiveRecord::Base
  has_many :line_items, :dependent => :destroy

  def add_product(product)
    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, :price => product.price)      
    end
    current_item
  end

  def total_price 
    line_items.to_a.sum { |item| item.total_price }
  end

end

Я проверяю, что добавление одного и того же продукта в корзину в два раза увеличивает количество, а не добавляет новую строку (line_item). Вот тест:

test "line item quantity is increased when duplicate product is added" do
    cart = carts(:one)
    ruby_book = products(:ruby)

    cart.add_product(ruby_book)
    cart.save    
    assert_equal 1, cart.line_items(ruby_book).to_a.count

    cart.add_product(ruby_book)
    cart.save
    assert_equal 1, cart.line_items(ruby_book).to_a.count
    assert_equal 2, cart.line_items(ruby_book).first.quantity # fail!
  end

Я получаю ошибку при последнем утверждении. Количество равно 1, где я ожидаю 2. Я проверил файл test.log, и для моего экземпляра sqlite3 никогда не запускалось обновление ... Я могу добавить журнал или файлы Fixtures, если это необходимо, но я уверен, что это такой вопрос новичка, что он не понадобится!

Заранее спасибо,

Stu

1 Ответ

1 голос
/ 05 июля 2011

Вы изменяете количественный атрибут позиции, но не сохраняете изменение. Вызов save для родителя не сохранит атрибуты детей. Вы можете вызвать save для current_item в методе add_product после строки приращения.

if current_item
  current_item.quantity += 1
  current_item.save
else
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...