2012-06-09 2 views
5

Aquí está mi función :Prueba Diseñar + OmniAuth (Facebook) con pepino

Scenario: Professor is not signed up and tries to sign in with Facebook 
     Given I do not exist as a professor 
     When I sign in as a professor with Facebook 
     Then I should see a successful sign in message 
     When I return to the site 
     Then I should be signed in as a professor 

Aquí es la definición paso para When I sign in as a professor with Facebook

When /^I sign in as a professor with Facebook$/ do 
    set_omniauth 
    visit "/professors/auth/facebook" 
end 

Y aquí es la definición de set_omniauth ayudante:

def set_omniauth(opts = {}) 
    default = {:provider => :facebook, 
      :uuid  => "1234", 
      :facebook => { 
          :email => "[email protected]", 
          } 
      } 

    credentials = default.merge(opts) 
    provider = credentials[:provider] 
    user_hash = credentials[provider] 

    OmniAuth.config.test_mode = true 

    OmniAuth.config.mock_auth[provider] = { 
    'uid' => credentials[:uuid], 
    "extra" => { 
    "user_hash" => { 
     "email" => user_hash[:email], 
     } 
    } 
    } 
end 

Entonces ... Cuando visito /professors/auth/facebook, esta acción se llama

def facebook 
    @professor = Professor.find_for_facebook_oauth(request.env["omniauth.auth"], current_professor) 
    if @professor.persisted? 
     flash[:notice] = "Welcome! You have signed up successfully." 
     sign_in_and_redirect @professor, :event => :authentication 
    else 
     session["devise.facebook_data"] = request.env["omniauth.auth"] 
     redirect_to new_professor_registration_url 
    end 
    end 

Y, por último, el método find_for_facebook_oauth definición es:

def self.find_for_facebook_oauth(access_token, signed_in_resource=nil) 
    data = access_token["extra"]["raw_info"] 
    if professor = self.find_by_email(data.email) 
     professor 
    else # Create a professor with a stub password. 
     self.create(:email => data.email, :password => Devise.friendly_token[0,20]) 
    end 
    end 

Cuando se ejecuta esta función, aparece el mensaje de error siguiente:

undefined method `email' for {"email"=>"[email protected]"}:Hash (NoMethodError) 

Así, he comprobado lo que Facebook devuelve realmente:

#<Hashie::Mash email="[email protected]" ... 

pero esto es un objeto diferente que un conjunto de hash normal:

OmniAuth.config.mock_auth[provider] = { 
    'uid' => credentials[:uuid], 
    "extra" => { 
    "user_hash" => { 
     "email" => user_hash[:email], 
     } 
    } 

lo tanto, mi pregunta es: ¿Cómo voy a probar esto correctamente ? Seguí OmniAuth Integration Tetsing y establecieron un Hash, y no un Hashie.

Respuesta

2

lo necesario para crear el hash usando construido en un método OmniAuth para la creación de un objeto Hashie:

OmniAuth.config.mock_auth[provider] = OmniAuth::AuthHash.new({ 
'uid' => credentials[:uuid], 
"extra" => { 
"user_hash" => { 
    "email" => user_hash[:email], 
    } 
}) 
Cuestiones relacionadas