2011-07-12 38 views
28

Tôi muốn ghi đè Devise::RegistrationsController để triển khai một số chức năng tùy chỉnh. Để làm điều này, tôi đã tạo ra một mới RegistrationsController như vậy:Cách viết kiểm tra bộ điều khiển khi bạn ghi đè bộ điều khiển đăng ký?

# /app/controllers/registrations_controller.rb 
class RegistrationsController < Devise::RegistrationsController 
    def new 
    super 
    end 
end 

và thiết lập các tuyến đường của tôi như thế này:

devise_for :users, :controllers => { :registrations => "registrations" } 

và cố gắng để kiểm tra nó như thế này:

describe RegistrationsController do 
    describe "GET 'new'" do 
    it "should be successful" do 
     get :new 
     response.should be_success 
    end 
    end 
end 

nhưng điều đó mang lại cho tôi một lỗi:

1) RegistrationsController GET 'new' should be successful 
Failure/Error: get :new 
AbstractController::ActionNotFound: 
    Could not find devise mapping for path "https://stackoverflow.com/users/sign_up". 
    Maybe you forgot to wrap your route inside the scope block? For example: 

     devise_scope :user do 
     match "/some/route" => "some_devise_controller" 
     end 
# ./spec/controllers/registrations_controller_spec.rb:13:in `block (3 levels) in <top (required)>' 

Vậy tôi đang làm gì sai?

Trả lời

46

Vấn đề là lập mưu là không có khả năng lập bản đồ các tuyến đường từ kiểm tra lại với bộ điều khiển gốc. Điều đó có nghĩa là trong khi ứng dụng của bạn thực sự hoạt động tốt nếu bạn mở nó trong trình duyệt, kiểm tra bộ điều khiển của bạn sẽ vẫn không thành công.

Giải pháp là để thêm các bản đồ devise để yêu cầu trước mỗi bài kiểm tra như sau:

before :each do 
    request.env['devise.mapping'] = Devise.mappings[:user] 
end 
+0

Bạn sẽ thêm tập tin này vào - Tôi không thể hiểu được, cảm ơn. – eWizardII

+0

Đặt nó trong các kiểm tra bộ điều khiển của bạn, ngay bên trong khối 'mô tả' đầu tiên. –

+0

Trong spec - Tôi có điều khiển các registration_controller là nơi tôi đặt nó như sau vô ích: require 'spec_helper' mô tả RegistrationsController làm mô tả "GET 'chỉnh sửa'" làm trước: mỗi làm request.env [ 'devise.mapping'] = Devise.mappings [: hướng dẫn] cuối nó "nên được thành công" làm get 'chỉnh sửa' response.should be_success cuối cuối cuối – eWizardII

-1

Tuyến đường của bạn sẽ trông như thế này:

devise_for :users, :controllers => { :registrations => "registrations" } do 
    get "https://stackoverflow.com/users/sign_up/:invitation_token" => 'registrations#new' 
end 
+0

Đó là những gì tôi có? Sự khác biệt duy nhất là hashatat synatax -> 'registrations:' vs ': registrations =>'. Điều đó không nên tạo sự khác biệt trừ khi tôi chạy ứng dụng của mình trong Ruby <1.9.2. –

+0

Ah, ok. Không biết điều đó. Chưa từng thấy cú pháp đó trước đây. Cảm ơn. –

+0

;) Đẹp hơn nhiều khi bạn quen với nó! Tôi nghĩ rằng nó sẽ chỉnh sửa câu hỏi của tôi anyway, chỉ trong trường hợp Nó confuses bất cứ ai. –

Các vấn đề liên quan