2012-02-29 35 views
5

Chúng tôi đang gặp vấn đề lạ. Trong bộ điều khiển ứng dụng, chúng tôi có một tập hợp before_filter yêu cầu xác thực bằng cách sử dụng devise và chuyển hướng nếu cần thiết cho trang đăng nhập.rspec bỏ qua skip_before_filter?

Trong bộ điều khiển thư viện của chúng tôi, chúng tôi bỏ qua điều này before_filter.

skip_before_filter :authenticate_user!, :only => :show 

Khi chúng tôi chạy một thử nghiệm chức năng đơn giản với capybararspec thử nghiệm thất bại.

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

Dường như nó không bỏ qua bộ lọc này. Nội dung trang là của trang đăng nhập.

Khi chúng tôi chạy điều này với rails server, nó hoạt động tốt.

Bất kỳ ý tưởng nào tại sao nó hoạt động theo cách này hoặc những gì cần tìm để giải quyết vấn đề này?

UPDATE:

Nó có thể là giá trị thêm rằng điều này chỉ xảy ra sử dụng Linux. Theo MacOS 10.7 với thiết lập "tương tự" nó hoạt động tốt.

Mã Bộ điều khiển:

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 

Các application_controller trông giống như (không có set_i18n_locale_from_url):

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

Tuyến đường:

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

tôi nhìn thấy hành vi tương tự chính xác này. –

Trả lời

3

Tôi đoán f Điều đầu tiên bạn có thể làm là để xem có hay không "truy cập"/en/library/máy tính "" thực sự gọi hành động hiển thị trong bộ điều khiển của bạn. Nếu bạn đang sử dụng một con đường yên tĩnh mà truy cập vào action show, sử dụng ở vị trí của đường dẫn URL hiện tại của bạn để nó trông giống như sau:

visit library_path('computers') 

Tiếp ném một số văn bản gỡ rối (puts 'blah') bên trong trình diễn của bạn phương pháp mà bạn đang thử nghiệm chống lại và đảm bảo rằng nó sắp xuất hiện. Có lẽ bằng cách gọi một con đường nghiêm ngặt làm điều gì đó kỳ lạ với bỏ qua before_filters.

CẬP NHẬT:

Có vẻ như bộ điều khiển của bạn có thể không giải thích 'máy tính' làm id. Bên trong tuyến đường của bạn, nếu bạn thêm một tuyến đường thành viên để tài nguyên thư viện của bạn:

resources :libraries do 
    member do 
    get :computers 
    end 
end 

Và trong điều khiển của bạn add bạn:

def computers 
    @categories = Category.all 
end 

Và thay đổi bạn skip_before_filter sử dụng: máy tính

+0

OK, chúng tôi đã thử điều này. Cùng một kết quả. Kiểm tra không thành công. Đầu ra trình gỡ lỗi bên trong phương thức hiển thị không được thực thi. – NielsH

+0

bạn có thể đăng mã điều khiển của mình không? –

+0

OK, vừa cập nhật bài đăng gốc. – NielsH

1

tôi nghĩ rằng nó có liên quan đến các nhà máy và các bản địa hóa khác nhau mà chúng tôi có cho một mô hình danh mục. Có lẽ dưới Linux nó sử dụng một miền địa phương mặc định khác nhau và đó là lý do tại sao nó không thành công.

tôi loại bỏ các before_filter cho xác thực và hầu hết các xét nghiệm vượt qua, nhưng điều này xảy ra:

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