Как смоделировать присвоение переменной перед фильтром? ActionController :: TestCase - PullRequest
0 голосов
/ 10 марта 2010

Идея такова: при посещении страницы покупки преинициализированная (с использованием 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   

1 Ответ

1 голос
/ 11 марта 2010

Похоже, вы уже используете приборы для своих предметов, почему бы не использовать прибор также для покупки? Нет необходимости делать все возможное, чтобы заглушить пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...