2013-10-28 7 views
8

में नहीं लॉग इन के लिए पुनर्निर्देश यह करती हैं, जिसे नहीं प्रवेश के उपयोगकर्ता (उर्फ एक अतिथि) की कोशिश करता प्रवेश पृष्ठ पर रीडायरेक्ट का एक before_filter साथ एक बहुत ही विशिष्ट नियंत्रक के लिए एक कल्पना है /projects/new तक पहुंचने के लिए।"ध्यान में न आया फेंक: वार्डन" जब परीक्षण उपयोगकर्ताओं

describe ProjectsController do 
    (...) 

    describe "GET new" do 
    context 'when not logged in' do 
     before { sign_in_nobody } 

     context 'creating project' do 
     before { get :new } 

     it 'denies access' do 
      expect(response).to be_redirect 
     end 
     end 
    end 
    end 
end 

मैं मेहमानों, उपयोगकर्ताओं, व्यवस्थापक और superadmins के लिए :index, :show और :new तक पहुँचने का सभी संभावित परिणामों specced है। मुझे लॉग इन या अतिथि उपयोगकर्ता, व्यवस्थापक या नहीं का उपयोग करने में कोई समस्या नहीं थी - लेकिन वास्तव में यह पहली बार है जब इस स्पेक ने एक क्रिया को छुआ जिसमें डेविस के before_filter :autheticate_user! शामिल हैं और यह उस पर बुरी तरह विफल रहता है।

Failures: 

1) ProjectsController GET new when not logged in creating project denies access 
    Failure/Error: get :new 
    ArgumentError: 
    uncaught throw :warden 
    # ./spec/controllers/projects_controller_spec.rb:344:in `block (5 levels) in <top (required)>' 

मैं प्रश्न का उत्तर के लिए खोज की है: "कैसे ठीक अप्रमाणित के लिए परीक्षण करने के लिए -

आप पहले से ही संदेह हो सकता है कल्पना भी expect(response).to be_redirect तक पहुंच नहीं है, यह पहले एक hissy फिट फेंकता (अतिथि) rspec और devise के साथ उपयोगकर्ता ", लेकिन हर कोई केवल उपयोग करने के लिए आरएसपीईसी के लिए तैयार करने में उपयोगकर्ताओं को लॉग इन करने में समस्या के बारे में बात करता है। एक समस्या जो मुझे thusly हल:

#spec/support/devise_authenticators.rb 
include Devise::TestHelpers 

def sign_in_nobody 
    @request.env["devise.mapping"] = Devise.mappings[:user] 
    sign_in User.new 
end 

def sign_in_user 
    @request.env["devise.mapping"] = Devise.mappings[:user] 
    sign_in FactoryGirl.create(:user) 
end 

हालांकि यह नहीं है कि में प्रवेश यहाँ विफल रहता है, यह "लॉगिन नहीं किया जा रहा है।" अब तक मुझे बिल्कुल कुछ नहीं मिला है और मुझे लगता है कि किसी भी तरह से उन परिदृश्यों का परीक्षण करने के लिए है।

अभी मैं एक walkaround उपयोग कर रहा हूँ:

before { sign_in_nobody } 

context 'creating project' do 
    it 'denies access' do 
    expect{ get :new }.to raise_exception("uncaught throw :warden") 
    end 
end 

लेकिन फिर भी यह व्यावहारिक रूप से सही है यद्यपि (uncaught throw :warden होता है केवल जब authenticate_user! में विफल रहता है तो यह एक उम्मीद के रूप में इस्तेमाल किया जा सकता) सिद्धांत रूप में यह वास्तव में गंदा लगता है।

कोई विचार यह कैसे ठीक से करना है?

(... शायद मैं इस सब पर परीक्षण नहीं किया जाना चाहिए, के रूप में कैसे before_filter authenticate_user! की सत्यता की वसीयत के नहीं जिम्मेदारी मेरी है देख रहे हैं?)

+0

यह [SO11152671] का डुप्लिकेट है (http://stackoverflow.com/questions/11152671/devise-warden-error-thrown -किसी: प्रमाणीकृत उपयोगकर्ता-इन-कार्यात्मक-रेल-परीक्षण # जवाब-20,725,510)। मैंने वहां एक पूर्ण जवाब चिपकाया है। संक्षेप में, आपको डेविज़ टेस्ट हेल्पर और वार्डन टेस्ट हेल्पर के लिए वास्तविक कंट्रोलरटेस्ट क्लास दोनों में शामिल करना होगा, test_helper.rb में नहीं। – xeorem

उत्तर

4

यह सिर्फ काम करना चाहिए। मैंने बस एक ही समस्या को ठीक करने में थोड़ी देर बिताई, और यह पता चला कि हमारे पास एक परीक्षण सहायक था जो नियंत्रक परीक्षणों के लिए process ओवरराइड करता है। डेविस इसे catch :warden पर ओवरराइड करता है, इसलिए मुझे डिफ़ॉल्ट पैराम मॉड्यूल समेत include Devise::TestHelpers की आवश्यकता होती है।

मैं क्या जब मैं कहता हूँ हम process overrode बात कर रहा हूँ का एक उदाहरण के लिए, this answer जो वर्णन डिफ़ॉल्ट पैरामीटर सेट करने का तरीका शामिल करने के लिए format: json

+0

मुझे एक ही त्रुटि है, लेकिन मुझे समझ में नहीं आता कि मुझे 'डेविस :: टेस्टहेल्पर' शामिल करना चाहिए। क्या आप मेरी मदद कर सकते हैं? धन्यवाद – Rowandish

+0

आप इसे अपने परीक्षण कक्षा में या सभी नियंत्रकों के लिए सहायक में कर सकते हैं। उदाहरण के लिए, टेस्ट :: यूनिट और आरएसपीसी के लिए https://github.com/plataformatec/devise/wiki/How-To:-Controllers-tests-with-Rails-3-(and-rspec) पर शीर्ष 2 शीर्षलेख देखें। । –

+1

धन्यवाद! मुझे यह समस्या थी जहां 'बेकार फेंक दिया गया: वार्डन' त्रुटि उठाई जा रही थी, भले ही हमारे पास उचित परीक्षण सहायक शामिल थे। बाहर निकला, हमारे पास एक 'default_params' सहायक था जैसा आपने लिंक किया था, जो समस्या पैदा कर रहा था। – Percy

1

तो सबक है कि uncaught throw :warden होता है जब authenticate_user! विफल रहता है देखते हैं।

तो पता लगाएं कि आपके उपयोगकर्ता का प्रमाणीकरण असफल क्यों है, और आपने अपनी समस्या हल कर ली होगी।

1

मैं एक ऐसी ही समस्या थी और मैं इसे इस तरह हल:

e = catch(:warden) { get root_url } 
expect(e[:message]).to be(:not_activated) 
संबंधित मुद्दे