2012-02-29 24 views
5

हमें एक अजीब समस्या है। एप्लिकेशन नियंत्रक में हमारे पास before_filter सेट है जिसके लिए devise का उपयोग करके प्रमाणीकरण की आवश्यकता होती है और लॉगिन पृष्ठ पर आवश्यक होने पर रीडायरेक्ट की आवश्यकता होती है।rspec skip_before_filter को अनदेखा करता है?

हमारे लाइब्रेरी नियंत्रक में हम इस before_filter को छोड़ देते हैं।

skip_before_filter :authenticate_user!, :only => :show 

हम capybara और rspec परीक्षण में विफल रहता है के साथ एक सरल कार्यात्मक परीक्षण चलाते हैं।

it "should get only english articles within the category 'computers'" do 
    visit '/en/library/computers' 
    page.should have_content('computers') 
end 

ऐसा लगता है कि यह इस फ़िल्टर को नहीं छोड़ता है। पृष्ठ सामग्री लॉगिन पेज का है।

जब हम इसे rails server के साथ चलाते हैं तो यह ठीक काम करता है।

कोई विचार यह इस तरह से व्यवहार करता है या इसे हल करने के लिए क्या देखना है?

अद्यतन:

यह भी कहा कि यह केवल लिनक्स का उपयोग होता है लायक हो सकता है। "समान" सेटअप के साथ मैकोज़ 10.7 के तहत यह ठीक काम करता है।

नियंत्रक कोड:

class Library::CategoriesController < ApplicationController 
    skip_before_filter :authenticate_user!, :only => [:show] 

    # GET /categories/1 
    # GET /categories/1.json 
    def show 

    @categories = Category.all 
    @category = Category.find(params[:id]) 

    @articles = @category.articles.where(:locale => I18n.locale) 
    respond_to do |format| 
     format.html # show.html.erb 
    end 
    end 
end 

application_controller की तरह (set_i18n_locale_from_url के बिना) दिखता है:

class ApplicationController < ActionController::Base 
    protect_from_forgery 
    before_filter :set_i18n_locale_from_url, :authenticate_user! 
end 

मार्गों:

namespace :library do 
    get '/' => 'library#index', :as => 'library' 
    resources :categories, :path => '', :only => [:show] 
    resources :categories, :path => '', :only => [] do 
    resources :articles, :path => '', :only => [:show] 
    end 
end 
+0

मैं इस में ठीक उसी व्यवहार देख रहा हूँ। –

उत्तर

3

मैं च लगता है सबसे प्यारी चीज जो आप कर सकते हैं यह देखने के लिए है कि "विज़िट"/एन/लाइब्रेरी/कंप्यूटर 'वास्तव में आपके नियंत्रक में शो एक्शन को कॉल कर रहा है या नहीं। आप एक आरामदायक रास्ता है कि शो कार्रवाई तक पहुँचता है का उपयोग कर रहे हैं, तो का उपयोग करने वाले अपने वर्तमान url पथ के स्थान पर तो यह लग रहा है कि:

visit library_path('computers') 

अगला अपने शो के अंदर कुछ डिबगर पाठ (पुट 'blah') फेंक जिस विधि के साथ आप परीक्षण कर रहे हैं और सुनिश्चित कर लें कि यह आ रहा है। हो सकता है कि सख्त पथ बुलाकर कुछ अजीब कुछ_फिल्टर को बाईपास कर दे।

अद्यतन:

लग रहा है अपने नियंत्रक कोई एक आईडी के रूप में के कंप्यूटरों 'की व्याख्या जा रहा हो सकता है की तरह। अपने ऐड

resources :libraries do 
    member do 
    get :computers 
    end 
end 

और अपने नियंत्रक में: अपने मार्गों, यदि आप अपने पुस्तकालयों संसाधन के एक सदस्य के मार्ग को जोड़ने के अंदर क्या कंप्यूटर

+0

ठीक है, हमने कोशिश की। वही परिणाम परीक्षण विफल रहा है। शो विधि के अंदर एक डीबगर आउटपुट निष्पादित नहीं होता है। – NielsH

+0

क्या आप अपना कंट्रोलर कोड पोस्ट कर सकते हैं? –

+0

ठीक है, बस मूल पोस्ट अपडेट किया गया। – NielsH

1

मैं:

def computers 
    @categories = Category.all 
end 

और बदलते हैं तो आप का उपयोग करने के skip_before_filter लगता है कि कारखानों और हमारे पास एक श्रेणी मॉडल के लिए अलग-अलग स्थानीयकरण के साथ कुछ करना है। शायद लिनक्स के तहत यह एक अलग डिफ़ॉल्ट लोकेल का उपयोग करता है और यही कारण है कि यह विफल रहता है।

मैं प्रमाणीकरण के लिए before_filter हटा दिया और सबसे परीक्षण पास है, लेकिन ऐसा होता है:

1) Categories when user requests the category page 
     GET /en/library/computers 
     should get only english articles within the category computers 
    Failure/Error: page.should have_content(@english_articles[0].title) 
     expected there to be content "article 1 en" in "Bibliothek\nAdmin\nSign up\nLogin\n\n\n\n\n\n\n\n\nHome\n>\n\n\nLibrary\n>\n\n\Computer\n>\n\nThe spine\n\n\n\n\n\n\n\n\n\nComputer\n\n\n\n\n\n\n\n\n\n\n\n\nComputer\n\n\n\narticle 6 de\n\ncontent_6\n\n\narticle 7 de\n\ncontent_7\n\n\narticle 8 de\n\ncontent_8\n\n\narticle 9 de\n\ncontent_9\n\n\narticle 10 de\n\ncontent_10" 
    # ./spec/requests/categories_spec.rb:20:in `block (4 levels) in <top (required)>' 
संबंधित मुद्दे