2012-09-01 8 views
9

किसी कारण से, मुझे काम करने के लिए तैयार सहायक विधि साइन_इन नहीं मिल सकता है। current_user शून्य होने पर रहता है। क्या आप जानते हैं किस प्रकार की समस्या होगी?डेविस टेस्ट हेल्पर - साइन_इन काम नहीं करता

टेस्ट:

before :each do 
    @user = FactoryGirl.create :user 
    sign_in @user 
    end 

    describe "GET index" do 
    it "assigns all subscribers as @subscribers" do 
     subscriber = @user.subscribers.create! valid_attributes 
     get :index 
     assigns(:subscribers).should eq([subscriber]) 
    end 
    end 

कार्यान्वयन:

def index 
    @subscribers = current_user.subscribers.all <------- ERROR 

    respond_to do |format| 
     format.html # index.html.erb 
     format.json { render json: @subscribers } 
    end 
    end 

Error: 
NoMethodError: 
     undefined method `subscribers' for nil:NilClass 

किसी भी मदद की सराहना की है। धन्यवाद!

उत्तर

8

ऐसा लगता है कि आपने इसे हल किया है, जो आपके कोड द्वारा निर्णय ले रहा है। मैंने पहले ऐसा किया है, और किसी कारण से यह हर बार मुझे मिलता है।

rspec/रेल नियंत्रक चश्मा के लिए पाड़ बॉक्स से बाहर वसीयत :: TestHelpers साथ काम नहीं करेंगे।

get :index, {}, valid_session 

वैध_शन कॉल डेविस सेट अप सत्र सत्र को ओवरराइट करता है। इसे हटाएं:

get :index, {} 

यह काम करना चाहिए!

before :each do 
    @user = FactoryGirl.create :user 
    @user.confirm! 
    sign_in @user 
end 

(मुझे लगता है कि देखें:

+0

yup, वह समस्या थी! धन्यवाद! :) – Karan

+1

पहले मैंने सोचा कि यह काम नहीं करता है क्योंकि मैंने इसे 'pry' डीबग सत्र में करने की कोशिश की और यह असफल रहा। प्रिये से बाहर निकलना और इसे स्थापित करना, फिर उसने मेरे लिए काम किया। –

+0

आप किस फाइल के बारे में बिल्कुल बात कर रहे हैं? – d34th4ck3r

5

spec के लिए, include Devise::TestHelpers सुनिश्चित करें। मेरी कल्पना/spec_helper.rb में आसान, बनाने के लिए, मेरे पास है:

RSpec.configure do |config| 
    config.include Devise::TestHelpers, :type => :controller 
end 

जो स्वचालित रूप से सभी नियंत्रक चश्मा के लिए यह भी शामिल है। (: प्रत्येक)

@request.env["devise.mapping"] = Devise.mappings[:user] 
get :new 

यह शायद अपने से पहले के @request.env["devise.mapping"] = Devise.mappings[:user] जोड़ने के लिए सबसे अच्छा है:

इसके अलावा, आप काम करने के लिए sign_in प्राप्त करने के लिए ऐसा करने की जरूरत है। (ध्यान दें कि आप इसे अपने कॉन्फ़िगरेशन में कर सकते हैं यदि आप प्रत्येक नियंत्रक के लिए ऐसा नहीं करना चाहते हैं)।


current_user भाग के लिए, सुनिश्चित करें कि आप एक मॉडल User है, जहां आप फोन devise

class User < ActiveRecord::Base 
    # call devise to define user_signed_in? and current_user 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable, :confirmable 
    # though you don't have to include all these modules 
end 

वसीयत उपयोगकर्ता मॉडल में कॉल का उपयोग करता user_signed_in? और अपने नियंत्रकों में current_user परिभाषित करने के लिए किया हुआ है।

class Admin < ActiveRecord::Base 
    devise 
end 

तो वसीयत तरीकों admin_signed_in? और current_admin परिभाषित करना होगा: कारण यह है कि यदि आपके पास है।

+0

आपकी सहायता के लिए धन्यवाद से पहले निम्नलिखित ब्लॉक जोड़ने की आवश्यकता है। मैंने डेविस :: टेस्टहेल्पर को जोड़ा - इससे कोई फर्क नहीं पड़ता:/मेरा उपयोगकर्ता मॉडल तैयार करता है। मैं गिट हब पर अपनी परियोजना को होस्ट कर सकता हूं - यह अभी शुरू हुआ है, इसलिए इसमें वास्तव में बहुत अधिक कोड नहीं है ... – Karan

+0

https://github.com/karangb/smads/ – Karan

+0

यदि 'current_user' शून्य है, तो यह भी संकेत दे सकता है कि कोई उपयोगकर्ता साइन इन नहीं है (दूसरी समस्या के लिए)। – ronalchn

8

आप अपने User मॉडल में Confirmable मॉड्यूल (या अन्य वसीयत-authenticatable मॉडल) शामिल है, तो परीक्षण @user आपके द्वारा बनाए गए sign_in प्रभावी करने के लिए पुष्टि की जानी चाहिए इससे आपकी समस्या का नहीं था, लेकिन शायद एक और पाठक से लाभ होगा।)

+0

इसके लिए धन्यवाद, मैं यह पता लगाने की कोशिश कर रहा हूं कि 'साइन_इन' मेरे परीक्षणों में क्यों काम नहीं कर रहा था। पाठकों के लिए – jessewmc

+0

एफवाईआई: 'पुष्टि करें!' हटा दिया गया है; आपको इसके बजाय 'पुष्टि' का उपयोग करना चाहिए। – rbonick

+0

@ रोनिक मुझे काम करने के लिए 'पुष्टि' या '' पुष्टि 'नहीं मिल सका। मैंने पूरी लाइन को बाहर निकाला और मेरे परीक्षण अभी भी * इस * उत्तर का उपयोग करते हुए पास हो गए। मुझे यकीन नहीं है कि इसका क्या करना है। क्या यह ठीक है? – mikelovelyuk

0

जब परीक्षण करने के लिए है कि एक एसएसओ endpoint मैं लिख रहा था एक उपयोगकर्ता के लिए एक सत्र का निर्माण कर रहा कोशिश कर मैं इस समस्या का सामना करना पड़ा।चूंकि यह केवल एक परीक्षण पर लागू होता है, इसलिए मुझे अपने परीक्षण

before do 
    @request.env["devise.mapping"] = Devise.mappings[:user] 
    user = FactoryGirl.create(:user, :email => email, :password => "password") 
    user.confirm! 
    end 

    it "should create and session for the user and redirect to home page" do 
संबंधित मुद्दे