8

L'app My Rails 3.2 utilizza OmniAuth e Devise per accedere con Twitter. Il sistema di autenticazione funziona correttamente. Vorrei scrivere un test di integrazione in rspec per assicurarmi che tutto funzioni. Usando le informazioni nel wiki, ho scritto quanto segue, ma so che mi mancano le cose.Rails rspec e omniauth (test di integrazione)

Sotto test.rb in config/ambienti, ho le seguenti righe

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

La mia prova rspec si presenta così:

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 

autenticazione è il nome del mio modello e chiamando .UID nella console di rails restituisce la stringa fine.

che sto ottenendo il seguente errore quando ho eseguito questo test:

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

Qualcuno può aiutarmi a capire come utilizzare i mock OmniAuth che vengono forniti? Una spiegazione per perché e come funziona sarebbe apprezzato pure.

risposta

14

mi imbatto in qualcosa di simile.

Dopo aver cambiato il mio oggetto fittizio usare i tasti dei simboli:

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

di utilizzare chiavi di stringa:

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

ha funzionato.

E avete

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

qualche parte nel vostro testcase?

+1

Ciao! Ho provato request.env ["omniauth.auth"], ma ottengo l'errore "env metodo non definito per la classe nil" – izumeroot

+0

BTW, ecco la soluzione corretta https://gist.github.com/kinopyo/1338738 – izumeroot

6

Hai provato a spostare queste due linee su spec_helper.rb?

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

aggiungere anche i seguenti prima del blocco nel file di test:

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

Potete trovare maggiori informazioni su questo link: https://github.com/intridea/omniauth/wiki/Integration-Testing

1

Soluzione selezionata non funziona per me. La mia soluzione che ricevo da https://gist.github.com/kinopyo/1338738 e ufficiale doc https://github.com/intridea/omniauth/wiki/Integration-Testing qui:

# 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

grazie per indicare verso AuthHash.new (anche se è nella pagina web di test di integrazione) sono riuscito a farlo funzionare con koala solo se ho FactoryGirl del mio modello di autorizzazione che includeva il vero segreto e il token (ad esempio copia e incolla da un login di Facebook valido transizione) – Ben

1

consiglio vivamente this answer

In breve ...

  • Impostare il mock
  • fare la richiesta
  • prova qualsiasi codice è attaccato alla callback

Per esempio: testare la sessione [ 'uid'] è stato impostato (anche se, io optare per testare solo ciò che l'utente vede, o meglio, non vede)

il mio codice ...

config/ambienti/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 

spec/caratteristiche/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  

fatemi sapere se/come posso migliorare questa soluzione (e il mio codice!)

+0

Grande! Confermo che la soluzione risolve il problema – jedi

Problemi correlati