2012-02-29 4 views
5

Estamos teniendo un problema extraño. En el controlador de la aplicación tenemos un conjunto before_filter que requiere autenticación usando devise y redirige si es necesario a la página de inicio de sesión.rspec ignora skip_before_filter?

En nuestro controlador de biblioteca omitimos este before_filter.

skip_before_filter :authenticate_user!, :only => :show 

Cuando ejecutamos una prueba de funcionamiento sencillo con capybara y rspec no pasa la prueba.

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

Parece que no se salta este filtro. El contenido de la página es de la página de inicio de sesión.

Cuando ejecutamos esto con rails server funciona bien.

¿Alguna idea de por qué se comporta de esta manera o qué hay que buscar para resolver esto?

ACTUALIZACIÓN:

Podría valer la pena añadir que esto sólo sucede usando Linux. En MacOS 10.7 con la "misma" configuración, funciona bien.

Código de control:

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 

El application_controller parece que (sin la set_i18n_locale_from_url):

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

Rutas:

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

: Viendo a este mismo comportamiento exacto. –

Respuesta

3

supongo que la f Lo primero que puede hacer es ver si "visitar/en/library/computers" está llamando la acción de mostrar en su controlador. Si está utilizando un camino tranquilo que accede a la acción show, el uso que en lugar de su ruta URL actual por lo que se ve algo como:

visit library_path('computers') 

Siguiente tirar un poco de texto depurador (se pone 'bla') en el interior de su show método contra el que está probando y asegúrese de que esté apareciendo. Tal vez llamar a un camino estricto hace algo extraño al pasar por delante de los filtros anteriores.

ACTUALIZACIÓN:

Parece que el controlador podría no ser 'se interpreta como los ordenadores de un id. Dentro de sus rutas, lo que si se agrega una ruta miembro a su recurso de bibliotecas:

resources :libraries do 
    member do 
    get :computers 
    end 
end 

Y en el controlador de su complemento:

def computers 
    @categories = Category.all 
end 

y el cambio que skip_before_filter de usar: ordenadores

+0

Bien, hemos intentado esto. Mismo resultado. La prueba esta fallando Un resultado de depurador dentro del método show no se ejecuta. – NielsH

+0

¿puedes publicar tu código de controlador? –

+0

Bien, acabo de actualizar la publicación original. – NielsH

1

I Creo que tiene algo que ver con las fábricas y las diferentes localizaciones que tenemos para un modelo de categoría. Probablemente en Linux utiliza una configuración regional predeterminada diferente y es por eso que falla.

Quité el before_filter para la autenticación y pasan la mayor parte de las pruebas, pero esto ocurre:

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