8

La aplicación My Rails 3.2 usa OmniAuth y Devise para iniciar sesión con Twitter. El sistema de autenticación funciona bien. Me gustaría escribir una prueba de integración en rspec para asegurarme de que todo funciona. Usando la información en la wiki, escribí lo siguiente, pero sé que me están perdiendo cosas.Rails rspec y omniauth (pruebas de integración)

Bajo test.rb en config/ambientes, tengo las siguientes líneas

OmniAuth.config.test_mode = true 
OmniAuth.config.mock_auth[:twitter] = {:provider => 'twitter', :uid => '123545'} 

Mi prueba rspec se ve así:

describe "Authentications" do 
    context "without signing into app" do 

    it "twitter sign in button should lead to twitter authentication page" do 
     visit root_path 
     click_link "Sign in with Twitter" 
     Authentication.last.uid.should == '123545' 
    end 

    end 
end 

La autenticación es el nombre de mi modelo y llamando .uid en la consola de rieles devuelve la cadena bien.

que estoy recibiendo el siguiente error al ejecutar esta prueba:

Failure/Error: Authentication.last.uid.should == '123545' 
NoMethodError: 
undefined method `uid' for nil:NilClass 

Puede alguien ayudarme a averiguar cómo utilizar los simulacros OmniAuth que se proporcionan? Una explicación para por qué y cómo funciona sería apreciada también.

Respuesta

14

me encuentro con algo similar.

Después de cambiar mi objeto de burla el uso de teclas de símbolo:

OmniAuth.config.mock_auth[:twitter] = { 
    :uid => '1337', 
    :provider => 'twitter', 
    :info => { 
     :name => 'JonnieHallman' 
    } 
    } 

a la utilización de claves de cadena:

OmniAuth.config.mock_auth[:twitter] = { 
    'uid' => '1337', 
    'provider' => 'twitter', 
    'info' => { 
     'name' => 'JonnieHallman' 
    } 
    } 

funcionó.

¿Y tiene

request.env["omniauth.auth"] = OmniAuth.config.mock_auth[:twitter] 

algún lugar de su caso de prueba?

+1

¡Hola! Intenté request.env ["omniauth.auth"], pero obtengo el error "método indefinido env para la clase nula" – izumeroot

+0

BTW, aquí está la solución correcta https://gist.github.com/kinopyo/1338738 – izumeroot

6

¿Has intentado mover estas dos líneas a spec_helper.rb?

OmniAuth.config.test_mode = true 
OmniAuth.config.mock_auth[:twitter] = {:provider => 'twitter', :uid => '123545'} 

también añadir lo siguiente antes de bloque en el archivo de prueba:

before do 
    request.env["omniauth.auth"] = OmniAuth.config.mock_auth[:twitter] 
end 

Puede encontrar más información en este enlace: https://github.com/intridea/omniauth/wiki/Integration-Testing

1

La solución seleccionada no funciona para mí. Mi solución que recibo de https://gist.github.com/kinopyo/1338738 y oficial doc https://github.com/intridea/omniauth/wiki/Integration-Testing aquí:

# in spec/support/omniauth_macros.rb 
module OmniauthMacros 
    def mock_auth_hash 
    # The mock_auth configuration allows you to set per-provider (or default) 
    # authentication hashes to return during integration testing. 
    OmniAuth.config.mock_auth[:odnoklassniki] = OmniAuth::AuthHash.new({ 
     :provider => 'odnoklassniki', 
     :uid => '123545', 
     :info => OmniAuth::AuthHash::InfoHash.new({ 
      :name => 'mockuser' 
     }) 
    }) 

    end 
end 

# in spec/spec_helper.rb 
RSpec.configure do |config| 

    # email spec 
    config.include(EmailSpec::Helpers) 
    config.include(EmailSpec::Matchers) 
end 
OmniAuth.config.test_mode = true 

# in spec example: 
visit new_user_registration_path 
mock_auth_hash 
find('#btn-odnoklassniki').click # here is link generated as omniauth_authorize_path(resource_name, provider) 
+0

gracias por señalar hacia AuthHash.new (aunque está en la página web de prueba de integración) solo logré que esto funcione con koala si tengo FactoryGirl de mi modelo de autorización que incluye secreto real y token (por ejemplo, copiar y pegar desde un inicio de sesión de Facebook válido) transición) – Ben

1

le recomiendo this answer

En pocas palabras ...

  • Establecer la maqueta
  • hacer la solicitud
  • Prueba de cualquier código que se adjunta a la devolución de llamada

Por ejemplo: probar la sesión [ 'uid'] fue establecido (aunque, optar a probar sólo lo que el usuario ve, o, más bien, no ve)

Mi código ...

config/ambientes/test.rb

Rails.application.configure do 
    ... 
    OmniAuth.config.test_mode = true 
    OmniAuth.config.mock_auth[:linkedin] = { 
     'provider' => 'linkedin', 
     'uid' => '123545', 
     'info'=> 
     { 'email'=>'[email protected]', 
     'first_name'=>'Dave', 
     'last_name'=>'Wallace' } 
    } 
end 

especificaciones/características/sign_in_feature_spec.rb

require 'rails_helper' 

feature 'Sign in with LinkedIn' do 

    before do 
    OmniAuth.config.add_mock(:linkedin, {:uid => '12345'}) 
    end 

    let(:user) { create(:user) } 

    scenario 'with valid email and password' do 
    visit '/' 
    expect(page).to have_no_content 'Sign Out' 
    click_link 'nav-sign-in' # image/button: Sign in with LinkedIn 
    expect(page).to have_content 'Sign Out' 
    end 
end  

Avísame si/cómo puedo mejorar esta solución (y mi código!)

+0

¡Genial! Confirmo que la solución resuelve el problema – jedi

Cuestiones relacionadas