Sinatra + Rack :: Test + Rspec2 - Использование сессий? - PullRequest
5 голосов
/ 08 октября 2011

Я впервые работаю с Синатрой, и я просто не могу заставить сеансы работать в моих тестах.В моем приложении enable :sessions.

Я пытался:

get "/controller/something", {}, "rack.session" => {:session => "Aa"}

или

get "/controller/something", {}, "session" => {:session => "Aa"}

Но в моем запросе не заданы переменные сеанса.Я посмотрел в Интернете и попробовал несколько предложений, но ничего не работает.Я что-то упустил?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 18 октября 2011

Rack больше не поддерживает передачу сеансов через запрос (Rack> = v1.0). Прочтите этот пост для получения более подробной информации об этом.

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

post '/set_sess_var/:id'
  session[:user_id] = params[:id]
end

Давайте представим, что есть еще один маршрут, который вы на самом деле хотели проверить, который использует переменную сеанса, например:

get '/get_user_attributes'
  User.find(session[:user_id]).attributes
end

Затем в ваших тестах вы должны сначала вызвать маршрут, который устанавливает сеанс, а затем перейти на другой маршрут, который его использует. Вот нотация rspec, так как это то, что я использую для тестирования:

it "should print out user attributes" do
  user_id = 1
  post '/set_sess_var/' + user_id
  get '/get_user_attributes'
  last_response.body.should == User.find(user_id).attributes
end

Если вы собираетесь часто использовать маршрут в своих тестах, то вы можете написать метод для выполнения этого в своем тестовом файле (если вы используете Rspec, тогда этот метод может идти в вашем spec_helper.rb или в ваш файл controller_spec.rb):

def set_session_var(user_id)
  post '/set_sess_var/' + user_id
end

и затем вызывайте его в своих тестах, когда вам нужно было установить:

it "should print out user attributes" do
  set_session_var(1)
  get '/get_user_attributes'
  last_response.body.should == User.find(1).attributes
end
1 голос
/ 08 октября 2011

Вам нужно использовать ключи, которые в конечном итоге будут env:

get "/controller/something", {}, "rack.session" => {:session => "Aa"}
...