2012-02-29 19 views
5

Mamy dziwny problem. W kontrolerze aplikacji mamy zestaw before_filter, który wymaga uwierzytelnienia przy użyciu devise i przekierowuje w razie potrzeby do strony logowania.rspec ignoruje skip_before_filter?

W naszym kontrolerze biblioteki pomijamy tę before_filter.

skip_before_filter :authenticate_user!, :only => :show 

Kiedy uruchomić prosty test funkcjonalny z capybara i rspec test zakończy się niepowodzeniem.

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

Wygląda na to, że nie pomija tego filtru. Treść strony jest stroną logowania.

Po uruchomieniu tego z rails server działa dobrze.

Jakieś pomysły, dlaczego zachowuje się w ten sposób lub na co zwrócić uwagę, aby rozwiązać ten problem?

UPDATE:

To może być Warto dodać, że to dzieje się tylko za pomocą Linuksa. W MacOS 10.7 z tą samą konfiguracją działa dobrze.

Kod Kontroler:

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 wygląda (bez set_i18n_locale_from_url):

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

trasach:

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

widzę dokładnie ten sam problem. –

Odpowiedz

3

Chyba f Pierwszą rzeczą, jaką możesz zrobić, to sprawdzić, czy "visit"/en/library/computers "faktycznie wywołuje akcję show w kontrolerze. Jeśli używasz spokojny ścieżkę, która uzyskuje dostęp do akcji show, używać, zamiast aktualnej ścieżki url tak to wygląda mniej więcej tak:

visit library_path('computers') 

Następny rzucić jakiś tekst debugger (kładzie „bla”) wewnątrz pokazu metoda, której testujesz i upewniasz się, że się zbliża. Być może przez wywołanie ścisłej ścieżki robi się coś dziwnego z pominięciem before_filters.

UPDATE:

Wygląda na to, kontroler może być nie być interpretowanie „komputery” jako ID. Wewnątrz swoich tras, co, jeśli dodać trasę użytkownika do zasobu biblioteki:

resources :libraries do 
    member do 
    get :computers 
    end 
end 

aw kontrolerze Twojego koszyka:

def computers 
    @categories = Category.all 
end 

i zmienić ty skip_before_filter używać: komputery

+0

Dobra, próbowaliśmy tego. Ten sam wynik. Test się nie udaje. Wyjście debuggera w metodzie show nie zostanie wykonane. – NielsH

+0

Czy możesz zamieścić swój kod kontrolera? –

+0

Okay, właśnie zaktualizowałem oryginalny post. – NielsH

1

I myślę, że ma to coś wspólnego z fabrykami i różnymi lokalizacjami, które mamy dla modelu kategorii. Prawdopodobnie pod linuxem używa innego domyślnego ustawienia narodowego i dlatego nie działa.

usunąłem before_filter do uwierzytelniania i większość testów przejdzie, ale to nastąpi:

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)>'