2012-06-22 32 views
7

Tôi có tài nguyên trong đó hành động mới yêu cầu người dùng đăng nhập để xem. Nếu người dùng cố tạo tài nguyên mới mà không đăng nhập, họ sẽ được chuyển hướng (302'd) đến trang đăng nhập. thử nghiệm chức năng của tôi trông như thế này:Phát hiện lỗi cảnh báo lỗi cho authenticate_user trong kiểm tra Rails chức năng

test "should not get new unless logged in" do 
    get :new 
    assert_response :redirect 
    end 

Các stacktrace trông giống như sau:

ArgumentError: uncaught throw :warden 
    /.../gems/warden-1.1.1/lib/warden/proxy.rb:114:in `throw' 
    /.../gems/ruby-1.9.2-p318/gems/warden-1.1.1/lib/warden/proxy.rb:114:in `authenticate!' 
    /.../gems/ruby-1.9.2-p318/gems/devise-2.0.4/lib/devise/controllers/helpers.rb:48:in `authenticate_user!' 

Tôi có một before_filter để authenticate_user trước khi hành động mới.

Tôi hiểu tại sao authenticate_user! là thất bại nhưng tôi không thể hiểu tại sao nó ném một lỗi. Không nên nó chỉ hoạt động như trong ví dụ webapp. chuyển hướng người dùng đến trang đăng nhập?

Cảm ơn.

+0

Bạn đã bao giờ tìm cách kiểm tra trường hợp người dùng chưa đăng nhập chưa? Tôi đang gặp vấn đề tương tự. –

+1

Tôi không chắc chắn làm thế nào tôi cuối cùng đã nhận được làm việc này nhưng nó có thể xuống để thêm 'bao gồm Devise :: TestHelpers' cho lớp thử nghiệm.Cảm thấy tự do để thêm một pastebin với mã của bạn và tôi sẽ cố gắng để có một cái nhìn. – Ger

+0

trong trường hợp của tôi điều này hóa ra là một 'js: true' trong khai báo tính năng (mà tôi không cần, và bằng cách nào đó gây ra lỗi này) – xxjjnn

Trả lời

0

Tôi biết đây là một câu hỏi cũ bây giờ nhưng tôi tìm thấy câu trả lời của wiki lập mưu

https://github.com/plataformatec/devise/wiki/How-To%3a-Test-with-Capybara

này có hướng dẫn từng bước đó là quá involde để tái tạo ở đây, tuy nhiên người đầu tiên bước là bao gồm những người trợ giúp kiểm tra Warden

include Warden::Test::Helpers 
Warden.test_mode! 

Hope this helps

+1

Điều này xảy ra với tôi khi tôi có thêm logic gắn vào người dùng (họ cần để được một quản trị viên phê duyệt, không xuất hiện trên radar vấn đề Devise của tôi). Vì vậy, ngay cả khi người dùng hợp lệ, hãy đảm bảo họ có tất cả các cờ/quyền chính xác để có thể xem trang. – Danny

+0

Xem câu trả lời của tôi ở trên. Bạn cũng sẽ muốn bao gồm Warden.test_reset! trong chức năng teardown của bạn để hoàn tác bất kỳ thay đổi nào ở cuối bài kiểm tra của bạn. Nếu không, bất kỳ hành động nào của người quản lý được thực hiện trong một trường hợp thử nghiệm (ví dụ: đăng nhập) sẽ tràn vào trường hợp tiếp theo. – xeorem

2

này xảy ra khi Warden và/hoặc Dev ise inclusions bị thiếu hoặc không được thêm vào đúng chỗ. Thật hấp dẫn khi thêm chúng vào test_helper.rb vì đó là nơi những người trợ giúp thường đi nhưng điều đó sẽ không hoạt động đúng với Devise.

Xem https://github.com/plataformatec/devise/issues/1029 để biết thêm chi tiết.

Để giải quyết vấn đề này, bao gồm cả các helper lập mưu và helper Warden trong lớp thử nghiệm điều khiển như thế này:

require 'test_helper'         
class UserControllerTest < ActionController::TestCase 
    include Devise::TestHelpers       
    include Warden::Test::Helpers       
    Warden.test_mode!          

    def teardown           
    Warden.test_reset!         
    end             

    # test "the truth" do        
    # assert true 
    # end 
end 

này là cần thiết cho mỗi điều khiển có sử dụng xác thực lập mưu của.

EDIT: Như đã đề cập trong các nhận xét bên dưới, hãy di chuyển include Warden:TestHelpers từ spec_helper.rb (hoặc test_helper.rb) sang rails_helper.rb cũng hoạt động.

+3

Bạn không cần phải bao gồm những người trợ giúp trong mỗi lớp học. Bạn chỉ có thể thêm phần sau vào test_helper của bạn: 'class ActionController :: TestCase bao gồm Devise :: TestHelpers bao gồm Warden :: Test :: Helpers end' (xin lỗi về việc thiếu khoảng trắng thích hợp) – sbleon

+1

Câu trả lời của bạn không làm việc chút nào. Xin lỗi, nhưng đó thực sự không phải là câu trả lời thích hợp, để bao gồm tất cả sự lộn xộn trong bộ điều khiển của bạn. – wegginho

+2

Tôi đã có vấn đề này vì lý do này, và di chuyển 'config.include Devise :: TestHelpers' từ' spec_helper.rb' thành 'rails_helper.rb' đã giải quyết nó (bằng cách bao gồm mô-đun sau này trong chuỗi). –

1

Tôi gặp lỗi này, nhưng đó là vì tôi đặt include Devise::TestHelpers ngoài định nghĩa lớp học của mình.

require 'test_helper' 
include Devise::TestHelpers 

class Admin::ObservationsControllerTest < ActionController::TestCase 
    setup do 
    ... 

Điều này đã xảy ra lỗi bảo vệ cho 3 trong số 7 trường hợp thử nghiệm của tôi. Di chuyển include bên trong định nghĩa lớp đã sửa mọi thứ.

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