Bagaimana cara mengatur header permintaan dalam spesifikasi permintaan rspec?


127

Dalam spec pengontrol, saya dapat mengatur http accept header seperti ini:

request.accept = "application/json"

tetapi dalam spec request, objek "request" tidak ada. Jadi bagaimana saya bisa melakukannya di sini?

Alasan saya ingin mengatur http accept header ke json adalah agar saya dapat melakukan ini:

get '/my/path'

bukannya ini

get '/my/path.json'

Jawaban:


130

Anda harus dapat menentukan header HTTP sebagai argumen ketiga untuk metode get () Anda seperti dijelaskan di sini:

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

dan di sini

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

Jadi, Anda dapat mencoba sesuatu seperti ini:

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

3
Kami perlu menggunakan 'HTTP_ACCEPT': get '/my/path', nil, {'HTTP_ACCEPT' => "application/json"}
Matt Scilipoti

58
CATATAN: Ini untuk pengujian integrasi, mirip dengan komentar di bawah ini, dalam pengujian kontroler rspec-rails, Anda akan menggunakan: request.env ["HTTP_ACCEPT"] =
Alex Soto

5
Gotcha kecil yang saya temui karena saya konyol: Kunci header haruslah Strings. Simbol tidak akan muncul.
ajmurmann

Simbol @ajmurmann Now berfungsi: tajuk "Otorisasi" bisa :authorization.
Franklin Yu

13
Sintaks RSspec 3 yang baru akan seperti get my_resource_path, params: {}, headers: { 'HTTP_ACCEPT' => "application/json" }`
Cyril Duchon-Doris

39

Saya menggunakan ini di Test :: Unit:

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

3
Demikian pula, seperti yang dicatat oleh Alex Soto dalam komentar pada jawaban lain, dalam tes kontroler rspec-rails, Anda dapat menggunakan: request.env ["HTTP_ACCEPT"]
gerry3

terima kasih banyak bung, hanya contoh yang bekerja untuk saya pada aplikasi 2.3 lama denganActionController::TestCase
ecoologic

+1 Saya mencoba menggunakan kunci bernama Cookiedalam hash header (karena itulah yang dikirim browser saya), tetapi tidak berfungsi. Lalu saya lakukan request.keysdan melihat kunci bernama HTTP_COOKIE. Menggunakan itu berhasil. Mereka benar-benar harus mendokumentasikan ini dengan lebih baik.
Kelvin

Ini benar-benar berfungsi! Saya juga menemukan jawaban itu di github.com/rspec/rspec-rails/issues/65
Stepan Zakharov

@Sytse Sijbrandij Tidak ada yang bertanya tentang Test :: Unit. Pertanyaan yang diajukan tentang rspec.
Bryan Dimas

18

Saya menambahkan ini di sini, karena saya sangat macet mencoba melakukan ini di Rails 5.1.rc1

Tanda tangan metode get agak berbeda sekarang.

Anda perlu menentukan opsi setelah jalur sebagai argumen kata kunci, yaitu

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

FYI, argumen lengkap kata kunci adalah:

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


18

Ini berfungsi untuk spesifikasi pengontrol, bukan meminta spesifikasi:

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

2
Ini bekerja untuk saya, itu tergantung pada bagaimana Anda mengambil header, jika Anda menggunakan request.headersataurequest.env
Edgar Ortega

3
Catatan: Ini untuk tes pengontrol, bukan tes integrasi yang disebutkan dalam pertanyaan.
Franklin Yu

3
tidak berfungsi untuk tes integrasi. Namun, bekerja dengan tes pengontrol.
Petr Gazarov

9

Saya harus mengatur tajuk secara terpisah

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

Mencoba mengirimkannya melalui get / delete / .... adalah sampah lengkap di rails4 dan menyebabkan rasa sakit di kepala saya karena tidak pernah mengirim sebagai header tetapi sebagai parameter.

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

5
Apakah ini benar-benar memberikan jawaban untuk pertanyaan OP? Jika itu adalah pertanyaan baru, itu adalah ide yang lebih baik untuk membuka pertanyaan baru.
β.εηοιτ.βε

9

Menggunakan rspec dengan Rack::Test::Methods

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

Header var akan muncul sebagai X-Your-Header-Var


Catatan: ini untuk Test::Unit, bukan untuk RSpec.
Franklin Yu

itu menunjukkan rspec
James Tan

1
Ya. Dalam rspec itu menimbulkan ndefined method 'header'kesalahan bagi saya.
Евгений Масленков



2

Pertanyaan Anda sudah dijawab tetapi jika Anda ingin POST sesuatu ke tindakan lain Anda harus melakukan ini:

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

2

Coba sesuatu seperti:

get :index, :format => 'json' 

Tidak yakin, tetapi mungkin berfungsi karena rel sedang mencari .format untuk rute itu; ini juga bekerja untuk saya.
Alan

2
Jika ada yang bertanya-tanya, ini hanya menambah format=jsonparam kueri. Tidak sama dengan bidang tajuk.
Kevin Carmody
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.