Укороченная версия:
Используя гем omniauth для sinatra, я не могу получить вход rspec для работы и сохранить сеанс в течение последующие запросы.
Основываясь на предложениях http://benprew.posterous.com/testing-sessions-with-sinatra и отключении сеансов, я выделил проблему следующим образом:
app.send(:set, :sessions, false) # From http://benprew.posterous.com/testing-sessions-with-sinatra
get '/auth/google_oauth2/callback', nil, {"omniauth.auth" => OmniAuth.config.mock_auth[:google_oauth2] }
# last_request.session => {"uid"=>"222222222222222222222", :flash=>{:success=>"Welcome"}}
# last_response.body => ""
follow_redirect!
# last_request.session => {:flash=>{}}
# last_response.body => Html for the homepage, which is what I want
Как решить Я получаю rspec для выполнения перенаправления и сохранения переменных сеанса? Возможно ли это в Sinatra?
Из http://benprew.posterous.com/testing-sessions-with-sinatra , похоже, что мне придется отправлять переменные сеанса при каждом get / отправить запрос, для которого мне нужен вход, но это не сработает в случае перенаправления.
Подробности:
Я пытаюсь использовать гем omniauth в sinatra со следующей настройкой:
spec_helper.rb
ENV['RACK_ENV'] = 'test'
# Include web.rb file
require_relative '../web'
# Include factories.rb file
require_relative '../test/factories.rb'
require 'rspec'
require 'rack/test'
require 'factory_girl'
require 'ruby-debug'
# Include Rack::Test in all rspec tests
RSpec.configure do |conf|
conf.include Rack::Test::Methods
conf.mock_with :rspec
end
web_spec.rb
describe "Authentication:" do
before do
OmniAuth.config.test_mode = true
OmniAuth.config.add_mock(:google_oauth2, {
:uid => '222222222222222222222',
:info => {
:email => "someone@example.com",
:name => 'Someone'
}
})
end
describe "Logging in as a new user" do
it "should work" do
get '/auth/google_oauth2/'
last_response.body.should include("Welcome")
end
end
end
При попытке аутентификации я получаю
ответ. Что мне не хватает? Не найдено
На странице Интеграционное тестирование документации omniauth упоминается добавление двух переменных среды:
before do
request.env["devise.mapping"] = Devise.mappings[:user]
request.env["omniauth.auth"] = OmniAuth.config.mock_auth[:twitter]
end
Но, похоже, только для рельсов, поскольку я добавил
request.env["omniauth.auth"] = OmniAuth.config.mock_auth[:google_oauth2]
в свой перед блоком
в моей спецификации, и я получаю эту ошибку:
Failure/Error: request.env["omniauth.auth"] = OmniAuth.config.mock_auth[:google_oauth2]
ArgumentError:
wrong number of arguments (0 for 1)
Изменить:
Вызов get
с помощью
get '/auth/google_oauth2/', nil, {"omniauth.auth" => OmniAuth.config.mock_auth[:google_oauth2]}
, кажется, дает мне last_request.env ["omniauth .auth "]
равно
{"provider"=>"google_oauth2", "uid"=>"222222222222222222222", "info"=>{"email"=>"someone@example.com", "name"=>"Someone"}}
, что кажется правильным, но last_response.body
по-прежнему возвращает
Not Found