2011-03-08 18 views
8

rspec, factory_girl & capybara ile entegrasyon testleri yazmaya çalışıyorum. Ayrıca salatalık yüklü, ama kullanmıyorum (bilgime).Raylar 3'te Rspec & Capybara ile Test Oturumları

Temel olarak db'yi kullanıcımla önceden doldurmak istiyorum, sonra ana sayfama git ve giriş yapmayı dene. User_path (@ user) öğesine yönlendirmeli. Bununla birlikte, oturumlar benim/rspec/istekler/bütünleştirme sınamalarında kalıcı görünmüyor gibi görünmektedir.

Benim Spec: /rspec/requests/users_spec.rb

require 'spec_helper' 

describe "User flow" do 

    before(:each) do 
    @user = Factory(:user) 
    end 

    it "should login user" do 

    visit("/index") 

    fill_in :email, :with => @user.email 
    fill_in :password, :with => @user.password 
    click_button "Login" 
    assert current_path == user_path(@user) 
    end 
end 

İade: Yerine

Failures: 

    1) User flow should login user 
    Failure/Error: assert current_path == user_path(@user) 
    <false> is not true. 
    # (eval):2:in `send' 
    # (eval):2:in `assert' 
    # ./spec/requests/users_spec.rb:16 

, benim please_login_path yönlendirir - Giriş herhangi bir nedenle başarısız olursa (gerçekleşmesi gereken veya eğer oturum [: user_id] ayarlanmamışsa).

session.inspect'i yerleştirmeye çalışırsam, bir nil nesnesi olarak başarısız olur. Ben kontrolör testleri (/rspec/controllers/sessions_spec.rb) bunu denerseniz

, hiç sorun oturumuna erişebilirler ve ben oturumu çağırabilirsiniz [: user_id] Eğer varsa

+1

Bunun ilgili olup olmadığını bilmiyorum, ancak @ user.password yazarak bir kullanıcının şifresini alamamalısınız. Bu, uygulamanızdaki bir güvenlik açığıdır. Şifreleri düz metin kullanarak mı saklıyorsunuz? –

+5

İlgili değil ve muhtemelen bir güvenlik açığı değil. #password'a yapılan çağrı, fabrika tarafından örnek değişkeninde ayarlandığından yalnızca bir şifre döndürür. Muhtemelen Devise'yi veya db'ye açık metin içinde parola özniteliğini sürdürmeyen benzer bir şey kullanıyordur ve bu durumda kullanılamayacak örnek değişkenleri de mevcut değildir. –

cevap

6

Devise kullanarak, in the warden wiki belirtildiği gibi Warden :: Test :: Helpers (spec_helper gereksiniminin hemen ardından iyi bir yer) eklemeniz gerekir.

Oturum açma işlemi sıfırdır çünkü kapibara bir entegrasyon testi olarak çalışırken ona erişim sağlamamaktadır.

1

Muhtemelen bundan yola çıkmışsınızdır, ama aynı soruyla uğraşıyordum. Bunun bir sözdizimi meselesi olduğu ortaya çıkıyor. :email ve :password sembolleri kullanıyordum ve bunun yerine dizeleri kullanmalıydım ("email" ve "password"). Başka bir deyişle

, deneyin bu değişen: Buna

fill_in :email, :with => @user.email 
fill_in :password, :with => @user.password 

:

fill_in "email", :with => @user.email 
fill_in "password", :with => @user.password 
3

aynı sorunlar var ve bir form doldurarak bazıları için bir seçenek olabilir, ancak ben vardı Kendi kimlik doğrulama rubyumu kullanıyorum çünkü bir üçüncü taraf auth sistemi kullanıyordum (Janrain tam olarak olmalıydı) .... testlerimde bu gibi bir şeye benziyordum:

İşte benim teknik özelliklerim/desteğim Kapibara ve selenyum ile benim istek spesifikasyonundaki Sonra

module AuthTestHelper 

    class SessionBackdoorController < ::ApplicationController 
    def create 
     sign_in User.find(params[:user_id]) 
     head :ok 
    end 
    end 

    begin 
    _routes = Rails.application.routes 
    _routes.disable_clear_and_finalize = true 
    _routes.clear! 
    Rails.application.routes_reloader.paths.each{ |path| load(path) } 
    _routes.draw do 
     # here you can add any route you want 
     match "/test_login_backdoor", to: "session_backdoor#create" 
    end 
    ActiveSupport.on_load(:action_controller) { _routes.finalize! } 
    ensure 
    _routes.disable_clear_and_finalize = false 
    end 

    def request_signin_as(user) 
    visit "/test_login_backdoor?user_id=#{user.id}" 
    end 

    def signin_as(user) 
    session[:session_user] = user.id 
    end 

end 

/test_helpers_and_stuff.rb

, aşağıdaki yaptım: BTW

describe "Giveaway Promotion" do 
    context "Story: A fan participates in a giveaway", js: :selenium do 
    context "as a signed in user" do 

     before :each do 
     @user = Factory(:user) 
     request_signin_as @user 
     end 

     it "should be able to participate as an already signed in user" do 
     visit giveaway_path 
     .... 
     end 
    end 
    end 
end 

, ben this post ve this post önerilen çözümleri denedikten sonra çözümleri ile geldi ve ikisi de benim için işe yaramadı. (ama kesinlikle benim çözümüme ilham verdiler)

İyi şanslar!

İlgili konular