Làm cách nào để đặt tiêu đề yêu cầu trong rspec spec spec?


127

Trong thông số kỹ thuật của bộ điều khiển, tôi có thể đặt tiêu đề chấp nhận http như thế này:

request.accept = "application/json"

nhưng trong đặc tả yêu cầu, đối tượng "request" là nil. Vì vậy, làm thế nào tôi có thể làm điều đó ở đây?

Lý do tôi muốn đặt tiêu đề chấp nhận http thành json là vì vậy tôi có thể làm điều này:

get '/my/path'

thay vì điều này

get '/my/path.json'

Câu trả lời:


130

Bạn sẽ có thể chỉ định các tiêu đề HTTP làm đối số thứ ba cho phương thức get () của bạn như được mô tả ở đây:

http://api.rubyonrails.org/groupes/ActionDispatch/Integration/RequestHelpers.html#method-i-get

và đây

http://api.rubyonrails.org/groupes/ActionDispatch/Integration/Session.html#method-i- process

Vì vậy, bạn có thể thử một cái gì đó như thế này:

get '/my/path', nil, {'HTTP_ACCEPT' => "application/json"}

3
Chúng tôi cần sử dụng 'HTTP_ACCEPT': get '/my/path', nil, {'HTTP_ACCEPT' => "application/json"}
Matt Scilipoti

58
LƯU Ý: Đây là để thử nghiệm tích hợp, tương tự như nhận xét bên dưới, trong các thử nghiệm bộ điều khiển rspec-rails, bạn sẽ sử dụng: request.env ["HTTP_ACCEPT"] =
Alex Soto

5
Gotcha nhỏ mà tôi gặp phải vì tôi ngớ ngẩn: Các khóa tiêu đề phải là Chuỗi. Biểu tượng sẽ không xuất hiện.
ajmurmann

@ajmurmann Bây giờ các biểu tượng hoạt động: tiêu đề "Ủy quyền" có thể :authorization.
Franklin Yu

13
Cú pháp RSspec 3 mới sẽ giống như get my_resource_path, params: {}, headers: { 'HTTP_ACCEPT' => "application/json" }`
Cyril Duchon-Doris

39

Tôi đã sử dụng điều này trong Test :: Đơn vị:

@request.env['HTTP_ACCEPT'] = "*/*, application/youtube-client"
get :index

3
Tương tự, như Alex Soto ghi chú trong một nhận xét về một câu trả lời khác, trong các bài kiểm tra bộ điều khiển rspec-rails, bạn có thể sử dụng: request.env ["HTTP_ACCEPT"]
gerry3

cảm ơn rất nhiều anh chàng, ví dụ duy nhất làm việc cho tôi trên một ứng dụng 2.3 cũ vớiActionController::TestCase
ecoologic

+1 Tôi đã thử sử dụng một khóa có tên Cookietrong hàm băm tiêu đề (vì đó là những gì trình duyệt của tôi gửi), nhưng nó không hoạt động. Sau đó, tôi đã làm request.keysvà thấy một chìa khóa có tên HTTP_COOKIE. Sử dụng mà làm việc. Họ thực sự nên tài liệu này tốt hơn.
Kelvin

Nó thật sự có hiệu quả! Tôi cũng tìm thấy câu trả lời đó trong github.com/rspec/rspec-rails/issues/65
Stepan Zakharov

@Sytse Sijbrandij Không ai hỏi về Test :: Đơn vị. Câu hỏi hỏi về rspec.
Bryan Dimas

18

Tôi đang thêm điều này vào đây, vì tôi đã bị mắc kẹt khi cố gắng làm điều này trong Rails 5.1.rc1

Chữ ký phương thức get bây giờ hơi khác.

Bạn cần chỉ định các tùy chọn sau đường dẫn làm đối số từ khóa, nghĩa là

get /some/path, headers: {'ACCEPT' => 'application/json'}

FYI, tập hợp đầy đủ các đối số từ khóa là:

params: {}, headers: {}, env: {}, xhr: false, as: :symbol


18

Điều này đang làm việc cho thông số kỹ thuật của bộ điều khiển, không yêu cầu thông số kỹ thuật:

request.headers["My Header"] = "something"

2
Điều này hiệu quả với tôi, nó phụ thuộc vào cách bạn truy xuất các tiêu đề, nếu bạn đang sử dụng request.headershoặcrequest.env
Edgar Ortega

3
Lưu ý: Đây là để kiểm tra bộ điều khiển, không phải kiểm tra tích hợp được đề cập trong câu hỏi.
Franklin Yu

3
đã không làm việc cho các bài kiểm tra tích hợp. Làm việc với các bài kiểm tra điều khiển, tuy nhiên.
Petr Gazarov

9

Tôi phải thiết lập các tiêu đề riêng

request.headers["Accept"] = "application/json"

Cố gắng gửi nó qua get / xóa / .... là rác hoàn toàn trong rails4 và gây đau đớn trong đầu tôi vì nó không bao giờ được gửi dưới dạng tiêu đề mà là tham số.

{"Accept" => "application/json"}

5
Điều này thực sự cung cấp một câu trả lời cho câu hỏi OP? Nếu đó là một câu hỏi mới, đó là một ý tưởng tốt hơn để mở ra một câu hỏi mới.
β.εητ 20/03/2015

9

Sử dụng rspec với Rack::Test::Methods

header 'X_YOUR_HEADER_VAR', 'val'
get '/path'

Các var tiêu đề sẽ đi qua như X-Your-Header-Var


Lưu ý: đây là cho Test::Unit, không phải cho RSpec.
Franklin Yu

nó chỉ ra rspec
James Tan

1
Vâng. Trong rspec nó gây ra ndefined method 'header'lỗi cho tôi.
Евгений Масленков



2

Câu hỏi của bạn đã được trả lời nhưng trong trường hợp bạn muốn ĐĂNG một cái gì đó sang hành động khác, bạn phải làm điều này:

post :save, {format: :json, application: {param1: "test", param2: "test"}}

2

Hãy thử một cái gì đó như:

get :index, :format => 'json' 

Không chắc chắn, nhưng có lẽ hoạt động vì đường ray đang tìm kiếm .format cho tuyến đường đó; điều này cũng xảy ra với tôi
Alan

2
Trong trường hợp bất cứ ai đang tự hỏi, điều này chỉ cần thêm format=jsonnhư là một truy vấn param. Không giống như một trường tiêu đề.
Kevin Carmody
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.