Как правильно проверить это действие контроллера с Следует? - PullRequest
1 голос
/ 21 января 2009

У меня есть следующие действия контроллера и тест. Я новичок в тестировании с Ifa, и я знаю , есть области моего контроллера, которые я могу тестировать дальше. Например, мои флеш-сообщения, а также проверка рендеринга.

Итак, мой вопрос, как бы я правильно протестировал это действие контроллера в Следует?

Мое действие контроллера (имена были изменены, чтобы защитить невинных):

def my_action
  return redirect_to(root_url) if @site.nil?
  @owner = current_site.owner
  if request.post?
    if params[:password].blank? || params[:email].blank?
      flash[:error] = "You must fill in both the e-mail and password fields"
      render :action => "my_action"
    else
      if @owner.authenticated?(params[:password])
        @owner.login = params[:email]
        @owner.save!
        @owner.do_some_method
        flash[:success] = "Success."
        render :action => "my_action"
      else
        flash[:error] = "Incorrect password"
        render :action => "my_action"
      end
    end      
  end  
end

Мой тест:

context "on POST to :my_action" do
  setup do
    Owner.any_instance().expects(:do_some_method)
    post :my_action, :email => 'foo@bar.com', :password => 'test'
  end
  should_assign_to :owner
  should "Change name and verify password and resend activation key" do
    assert_equal true, assigns(:owner).authenticated?('test')
    assert_equal 'foo@bar.com', assigns(:owner).login
  end
  should_respond_with :success
end

1 Ответ

2 голосов
/ 23 января 2009

Сейчас, похоже, вы тестируете функциональность, специфичную для модели внутри вашего контроллера, которая должна быть в модульном тесте.

Я бы посоветовал перефакторинг вашего контроллера, чтобы включить необходимую логику для обновления электронной почты владельца внутри модели владельца. Сделав это, вы сможете упростить контроллер до простого оператора типа if update; else; end и значительно упростить тест контроллера. Переместив логику в модель, вы можете использовать встроенные в Rails валидации.

Пара других вещей для рассмотрения:

  • Перенаправление после завершения действия POST предотвращает двойную публикацию пользователем случайно (большинство браузеров будут жаловаться, когда пользователь пытается это сделать).
  • Переместите проверку для @site, а также присвоение @owner на before_filters, если это делается более одного раза внутри контроллера.
  • Вы можете избежать проверки if request.post? с помощью verify или создания маршрута в `config / rout.rb '.

Ссылки

...