Вопрос по rspec2, http, ruby, ruby-on-rails, ruby-on-rails-3.1 – RunTimeError: ActionController :: RackDelegation в rspec 2.10.1 для rails 3.1.4 контроллера приложений

8

В нашем приложении rails 3.1.4,rspec используется для проверки публичного методаrequire_signin в контроллере приложения. Вот метод require_signin:

  def require_signin
    if !signed_in?  
      flash.now.alert = "Log in first!"
      redirect_to signin_path
    end
  end  

Здесьrspec код:

it "should invoke require_signin for those without login" do
  controller.send(:require_signin)
  controller {should redirect_to signin_path}  
end

Вышеrspec генерирует гигантскую многостраничную ошибку, начиная, как показано ниже:

RuntimeError:←[0m
       ←[31mActionController::RackDelegation#status= delegated to @_response.status=, but @_response is nil: #<ApplicationController:0x3
a67f10 @_routes=nil, @_action_has_layout=true, @_view_context_class=nil, @_headers={"Content-Type"=>"text/html"}, @_status=200, @_reques
t=#<ActionController::TestRequest:0x3a68720 @env={"rack.version"=>[1, 1], "rack.input"=>#<StringIO:0x34fad60>, ........

Что может быть не так сrspec код? Спасибо.

Добавьте награду, пожалуйста. Мне тоже нужен этот ответ tekknolagi

Ваш Ответ

3   ответа
0

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

RuntimeError:
    ActionController::RackDelegation#status= delegated to @_response.status=, but @_response is nil:
    ...many lines...

После более внимательного изучения ошибки я заметил, что в ней говорится:

@flashes={:alert=>"You have to confirm your account before continuing."}

Я только что добавил:confirmable вариант в Devise, и понял, что все пользователи, которых я создал, что я пытался войти в систему, как были неподтверждены, и, как таковые, не могли успешно войти в систему. Мне нужно было добавитьconfirmed_at Time.now на мою фабрику / создание приспособления для пользователей. Однако в вашем примере кажется, что вы пытаетесь выполнить тестирование, когда не вошли в систему, поэтому я не уверен, что это обязательно применимо.

3

что запускаю перенаправление на контроллере, вызывая вспомогательный метод, который я хотел проверить, но я еще не создал экземпляр тестового запроса. призваниеget :index перед вызовом ожидание избавилось от ошибки.

it "redirects if some condition" do
  subject.send(:helper_method)
  get :action # <= Need this before setting expectation below
  response.should redirect_to("/somewhere")
end
Спасибо из будущего! Это просто исправило проблему для меня.
1

should_receive передsend позвони так

it "should redirect to signin_path" do
  controller.should_receive(:redirect_to).with(signin_path)
  controller.send(:require_signin) 
end

Похожие вопросы