Как мне использовать omniauth в rspec для sinatra?

Укороченная версия:

Используя гем 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

5
задан zlog 8 December 2011 в 16:12
поделиться