Cookies не сохраняются в Rspec на рельсах 3.1 - PullRequest
9 голосов
/ 26 июля 2011

Это проблема со сбором файлов cookie в спецификации контроллера в следующих условиях:

  • rails 3.1.0.rc4
  • rspec 2.6.0
  • rspec-rails 2.6.1

У меня есть простая спецификация контроллера, которая создает пользователя Factory, вызывает метод входа, который устанавливает cookie, а затем проверяет, может ли вошедший в систему пользователь получить доступстраница.Проблема заключается в том, что все куки-файлы исчезают между установленным куки-файлом аутентификации и действием «show», вызываемым на моем контроллере.

Мой код работает нормально при запуске в браузере на сервере rails dev.Еще более странное поведение при запуске спецификации заключается в том, что все, что установлено, несмотря на то, что cookie-хэш исчезает, но все, что установлено в сеансовом хеше, сохраняется.Я просто что-то упускаю из-за того, как файлы cookie работают при использовании rspec?

Код спецификации

it "should be successful" do
  @user = Factory(:user)
  test_sign_in @user
  get :show, :id => @user
  response.should be_success
end

Код входа

def sign_in(user, opts = {})
  if opts[:remember] == true
    cookies.permanent[:auth_token] = user.auth_token
  else
    cookies[:auth_token] = user.auth_token
  end
  session[:foo] = "bar"
  cookies["blah"] = "asdf"
  self.current_user = user
  #there are two items in the cookies collection and one in the session now
end

Проверка подлинности на запросе get: showздесь происходит сбой, потому что куки [: auth_token] равен nil

def current_user
 #cookies collection is now empty but session collection still contains :foo = "bar"... why?
 @current_user ||= User.find_by_auth_token(cookies[:auth_token]) if cookies[:auth_token]
end

Это ошибка?Это какое-то намеренное поведение, которое я не понимаю?Я просто смотрю сквозь что-то очевидное?

Ответы [ 3 ]

7 голосов
/ 26 сентября 2011

Вот как я решил это:

def sign_in(user)
 cookies.permanent.signed[:remember_token] = [user.id, user.salt]
 current_user = user
 @current_user = user
end

def sign_out
 current_user = nil
 @current_user = nil
 cookies.delete(:remember_token)
end

def signed_in?
 return !current_user.nil?
end

По какой-то причине вы должны установить и @current_user, и current_user, чтобы он работал в Rspec.Я не уверен, почему, но это сводило меня с ума, так как он работал нормально в браузере.

3 голосов
/ 26 июля 2011

столкнулся с той же проблемой. Попробуйте использовать @request.cookie_jar из ваших тестов.

2 голосов
/ 17 января 2012

Дополнительные строки выше не нужны. Я обнаружил, что простой вызов метода self.current_user = user может автоматически обновить переменную экземпляра. По некоторым причинам, вызов его без self не вызывает метод setter.

Вот мой код без лишних строк:

def sign_in(user)
  cookies.permanent.signed[:remember_token] = [user.id, user.salt]
  self.current_user = user
end

def sign_out
  cookies.delete(:remember_token)
  self.current_user = nil
end

def current_user=(user)
  @current_user = user
end

Я до сих пор не знаю, почему, может быть, ошибка Rspec

...