2015-03-09 16 views
8

Tôi đang mô phỏng một yêu cầu đến từ một dịch vụ bên ngoài, sẽ không có mã thông báo xác thực. Tôi muốn thử nghiệm thất bại nếu thiếu skip_before_action :verify_authenticity_token.Làm thế nào để POST với thiếu authenticity_token trong rspec yêu cầu kiểm tra đường ray?

Làm cách nào để thực hiện điều này từ thông số yêu cầu Rspec?

Hiện tại tôi đang sử dụng post như bên dưới, nhưng nó được chấp nhận một cách hạnh phúc.

post endpoint, my_json_string, {'CONTENT_TYPE' => "application/json"} 

Trả lời

22

Bảo vệ CSRF disabled in test environment. Hãy thử bật tính năng này:

before do 
    ActionController::Base.allow_forgery_protection = true 
end 

after do 
    ActionController::Base.allow_forgery_protection = false 
end 
+1

Tính đến Rails 4.2. 5.1 và Rspec 3.4, kỹ thuật này hoạt động tốt. Tôi nghi ngờ đây là cách thích hợp để thực hiện giải pháp. –

+0

Điều đó thực sự hữu ích, cảm ơn bạn. – Joseworks

+0

Đối với các thử nghiệm bảo vệ CSRF, người ta có thể cần [đối sánh 'raise_error'] (https://www.relishapp.com/rspec/rspec-expectations/v/3-5/docs/built-in-matchers/raise- error-matcher): 'expect {post endpoint, my_json_string} .to raise_error (ActionController :: InvalidAuthenticityToken)'. Tôi nghĩ tôi phải kiểm tra mã trả lời của câu trả lời. –

1

Tắt tính năng bảo vệ CSRF không hoạt động đối với tôi. Vì vậy, tôi đã tạo ra mô-đun này trong đó sử dụng cơ thể phản ứng để lấy token xác thực:

https://gist.github.com/Rodrigora/440220a2e24bd42b7b0c

Sau đó, tôi có thể thử nghiệm đặt/bài yêu cầu mà không cần vô hiệu hóa bảo vệ giả mạo:

before do 
    @token = login(create(:user, password: 'password')) 
end 

it 'tests model creation' do 
    expect { 
    post_with_token 'path/to/model', model_params, @token 
    }.to change(Model, :count).by(1) 
end 
Các vấn đề liên quan