Идея такова: при посещении страницы покупки преинициализированная (с использованием before_filter) переменная @purchase получает save , если рассматриваемый товар не бесплатный.
Я получаю два бонуса: один за оплаченный предмет, а другой - за бесплатный. purchase.expected (: save) .returns (true) ожидает: save будет вызван только один раз, поэтому приведенный ниже тест работает.
Но это действительно ужасно. Тест это невероятно долго. Что было бы лучшим способом сделать это? Должен ли я издеваться над методом find_or_initialize? Если да, то как мне установить переменную экземпляра @purchase?
Извините за ужасный код ниже ...
def test_new_should_save_purchase_if_not_free
user = users(:some)
purchase = user.purchases.build
@controller.stubs(:current_user).returns(user)
purchases_mock = mock
user.stubs(:purchases).returns(purchases_mock)
purchases_mock.stubs(:build).returns(purchase)
purchase.expects(:save).returns(true)
get :new, :item_id => items(:not_free).id, :quantity => 10
get :new, :item_id => items(:free).id, :quantity => 400
end
def new
@purchase.quantity = params[:quantity]
@purchase.item = Item.find(params[:item_id])
unless @purchase.item.free?
@purchase.save
end
end
def find_or_initialize
@purchase = params[:id] ? current_user.purchases.find(params[:id]) : current_user.purchases.build
end