8

Rails 3.2 uygulamasında, Twitter ile oturum açmak için OmniAuth ve Devise kullanılır. Kimlik doğrulama sistemi iyi çalışıyor. Her şeyin çalıştığından emin olmak için rspec'te bir entegrasyon testi yazmak istiyorum. Bilgiyi wiki'de kullanarak, aşağıdakileri yazdım, ama bir şeyleri kaçırdığımı biliyorum. Yapılandırma/ortamlarda test.rb altındaRails rspec ve omniauth (tümleştirme sınaması)

, ben var aşağıdaki satırları

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

Benim RSpec testi şöyle görünür:

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 

Kimlik benim modeli ve .UID çağıran adıdır raylar konsolda dize ince döner.

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

kimse bana sağlanan OmniAuth mocks nasıl kullanılacağını anlamaya yardımcı olabilir: Ben bu testi çalıştırdığınızda

aşağıdaki hatayı alıyorum? için neden ve 'un niçin çalıştığı hakkında bir açıklama da takdir edilecektir.

cevap

14

:

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

Bu bağlantıyı daha fazla bilgi bulabilirsiniz.

sembol tuşlarını kullanarak benim sahte nesne değiştirdikten sonra:

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

dize anahtarlarını kullanarak:

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

işe yaradı.

Ve siz deneme ortamımızda bir yere

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

var mı?

+1

Merhaba! Request.env ["omniauth.auth"] 'ı denedim, ancak "nil class için undefined method env" hatası aldım – izumeroot

+0

BTW, burada doğru çözüm https://gist.github.com/kinopyo/1338738 – izumeroot

6

Bu iki satırı spec_helper.rb'ye taşımaya çalıştınız mı?

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

Ayrıca test dosyasında bloktan önce aşağıdakileri ekleyin: Ben benzer bir şey girmek https://github.com/intridea/omniauth/wiki/Integration-Testing

1

Seçilen çözüm benim için çalışmıyor. Çözümümün ben burada https://gist.github.com/kinopyo/1338738 ve resmi doc https://github.com/intridea/omniauth/wiki/Integration-Testing aldığım:

# 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

işaret ettiğin için teşekkürler AuthHash.new doğru (entegrasyon testi web sayfasında olmasına rağmen) ben sadece gerçek bir gizli ve belirteci dahil benim yetkilendirme modelimin FactoryGirl varsa (örneğin kopya ve geçerli bir facebook girişten yapıştırılan) koala ile çalışmak için başardı geçiş) – Ben

1

ederim Kısacası this answer

öneririm ...

  • sahte
  • callback'inde Örneğin

takılır ne olursa olsun kod isteği

  • Testi yapın ayarlayın: (ayarlandı [ 'uid'] oturumu test rağmen ... daha doğrusu,

    Kodum) görmez, kullanıcının gördüğü yalnızca ne test etmek seçebilir veya

    config/ortamlar/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/özellikler/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  
    

    Bu çözümü nasıl iyileştirebileceğini/bana bildirin (ve kodumu!)

  • +0

    Harika! Çözümün sorunu çözdüğünü doğrularım – jedi