2015-04-12 6 views
46

У меня есть сценарий, который отлично работает, когда я использую настоящий омнят, но не удается, когда я запускаю его с помощью макета auth в огурце/capybara.Callback redirect не сохраняющий сеанс

В обратном вызове, когда я делаю sign_in @user, он успешно создает пользователя и регистрируется в ... current_user. Но когда я тогда делаю redirect_to request.env['omniauth.origin'] || '/', внутри действия, которое следует, current_user теперь ничто.

Я подтвердил с помощью скриншотов/приостановку браузера, что он не работает с макетом auth. Такая же ошибка возникает в драйверах firefox и chrome.

Любая идея относительно того, почему это происходит?

/features/support/env.rb:

Cucumber::Rails::Database.javascript_strategy = :truncation 

Сценарий:

@javascript 
Scenario: 
    Given I am on the home page 
    When I press "Login" 
    And I should see "Login with Twitter" in the selector "#login-modal" 
    Given Omniauth returns a user with provider "twitter" and uid "1" and nickname "foo"  
    When I login with Twitter 
    Then I should be logged in as "foo" 

Шаг Определения:

Given(/^Omniauth returns a user with provider "(.*?)" and uid "(.*?)" and nickname "(.*?)"$/) do |provider, uid, nickname| 
    OmniAuth.config.test_mode = true 

OmniAuth.config.add_mock(provider.to_sym, { 
    :uid => uid, 
    :info => { 
     :name => nickname 
    } 
    }) 
end 

Then(/^I should be logged in as "(.*?)"$/) do |nickname| 
    expect(page).to have_content(nickname) 
end 

Auth обратного вызова:

def twitter 
    @user = User.from_omniauth(request.env["omniauth.auth"]) # this works-- I get the mock 
    sign_in @user 
    puts ">> in auth callback: just signed in user #{current_user.id}"   
    redirect_to request.env['omniauth.origin'] || '/' 
end 

Контроллер:

def new 
    puts ">> in my_controller#new: current_user = #{current_user.id if current_user}" 
end 

Огурцы Выход:

Given Omniauth returns a user with provider "twitter" and uid "1" and nickname "foo" 
>> in auth callback: just signed in user 1 
>> in my_controller#new: current_user = 
When I login with Twitter                 
Then I should be logged in as "foo"             
    expected to find text "foo" in [redacted] (RSpec::Expectations::ExpectationNotMetError) 
+0

Любое решение этой проблемы? Вы нашли что-нибудь? –

+0

Нет, все еще застрял. – joshwa

+0

ну, пожалуйста, просмотрите заголовок запроса для реального и для макета, может быть, вы должны добавить что-то в макет – ikirachen

ответ

1

Вы получаете пользователя и собирать его в новую переменную @user, но в то время как вы вызываете метод sign_in снова ты инициализировать новую переменную пользователя с используя (например. @user)