2011-03-08 17 views
8

के साथ परीक्षण सत्र मैं rspec, factory_girl & capybara के साथ एकीकरण परीक्षण लिखने की कोशिश कर रहा हूं। मेरे पास ककड़ी भी स्थापित है, लेकिन मैं इसका उपयोग नहीं कर रहा हूं (मेरे ज्ञान के लिए)।रेलवे 3 में रुपयेपीई और कैपिबरा

मैं मूल रूप से अपने उपयोगकर्ता के साथ डीबी को पूर्ववत करना चाहता हूं, फिर मेरे होम पेज पर जाएं और लॉग इन करने का प्रयास करें। इसे user_path (@user) पर रीडायरेक्ट करना चाहिए।

हालांकि, सत्र मेरे/rspec/अनुरोध/एकीकरण परीक्षणों में जारी नहीं लगते हैं।

मेरे कल्पना: /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 

रिटर्न:

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 

इसके बजाय, यह मेरी please_login_path पर रीडायरेक्ट - जो अगर लॉगिन किसी भी कारण से विफल रहता है होना चाहिए (या यदि सत्र [: user_id] सेट नहीं है)।

यदि मैं session.inspect डालने का प्रयास करता हूं, तो यह शून्य ऑब्जेक्ट के रूप में विफल हो जाता है।

अगर मैं नियंत्रक परीक्षण (/rspec/controllers/sessions_spec.rb) में यह करने के लिए प्रयास करते हैं, मुझे कोई समस्या नहीं के साथ सत्र का उपयोग कर सकते हैं, और मैं कॉल कर सकते हैं सत्र [: user_id]

+1

मुझे नहीं पता कि यह संबंधित है या नहीं, लेकिन आपको @ user.password टाइप करके उपयोगकर्ता का पासवर्ड प्राप्त करने में सक्षम नहीं होना चाहिए। यह आपके ऐप में एक सुरक्षा भेद्यता है। क्या आप सादा पाठ का उपयोग कर पासवर्ड संग्रहित कर रहे हैं? –

+5

यह संबंधित नहीं है, और शायद यह एक सुरक्षा भेद्यता नहीं है। #password पर कॉल केवल एक पासवर्ड देता है क्योंकि यह फैक्टरी द्वारा आवृत्ति चर में सेट है। ऐसा लगता है कि वह डेविस या ऐसा कुछ भी उपयोग कर रहा है जो स्पष्ट पाठ में डीबी में पासवर्ड विशेषता को जारी नहीं रखता है, और इसलिए यह उपलब्ध नहीं होगा कि इंस्टेंस वैरिएबल दूर जाये। –

उत्तर

6

आप कर रहे हैं डेविस का उपयोग करके, आपको in the warden wiki के रूप में उल्लिखित वार्डन :: टेस्ट :: हेल्पर्स (spec_helper की आवश्यकता के ठीक बाद एक अच्छी जगह है) शामिल करने की आवश्यकता होगी।

कॉल करने का सत्र शून्य वापस आ रहा है क्योंकि एकीकरण परीक्षण के रूप में चलते समय कैपिबरा इसका उपयोग नहीं करता है।

1

आप शायद इस से आगे बढ़े हैं, लेकिन मैं सिर्फ उसी प्रश्न के साथ संघर्ष कर रहा था। बाहर निकलता है यह वाक्यविन्यास का मामला था। मैं :email और :password के लिए प्रतीकों का उपयोग कर रहा था और मुझे इसके बजाय तारों का उपयोग करना चाहिए था ("email" और "password")।

दूसरे शब्दों में, कोशिश यह बदल:

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

मैं एक ही समस्या है और यद्यपि फ़ॉर्म भरना कुछ के लिए एक विकल्प हो सकता है, मैं करने के लिए किया था अपना खुद का प्रमाणीकरण रूबी रोल करें क्योंकि मैं एक थर्ड पार्टी ऑथ सिस्टम (जेन्रेन सटीक होना) का उपयोग कर रहा था .... मेरे परीक्षणों में मैंने इस तरह कुछ उपयोग कर समाप्त किया:

मेरे पास मेरे spec/support में क्या है /test_helpers_and_stuff.rb

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 
मेरे अनुरोध कल्पना में

फिर, capybara और सेलेनियम के साथ, मैं निम्नलिखित किया:

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 

Btw, मैं this post और this post करने का प्रस्ताव समाधान की कोशिश कर के बाद समाधान के साथ आया था और उनमें से कोई भी मेरे लिए काम नहीं किया। (लेकिन उन्होंने निश्चित रूप से मेरे समाधान को प्रेरित किया)

शुभकामनाएँ!

संबंधित मुद्दे