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'
Sergey
sumber

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"}
menunggu
sumber
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
Sytse Sijbrandij
sumber
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

Jules Copeland
sumber
18

Ini berfungsi untuk spesifikasi pengontrol, bukan meminta spesifikasi:

request.headers["My Header"] = "something"
kamar mayat
sumber
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"}
pengguna4694178
sumber
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

marcusb
sumber
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.
Евгений Масленков
7

Dengan RSpec 3 Anda dapat menggunakan sintaks berikut

get my_resource_path, params: {}, headers: { 'HTTP_ACCEPT' => "application/json" }

Seperti yang dijelaskan dalam dokumentasi Rspec resmi (tautan menunjuk ke v3.7)

Cyril Duchon-Doris
sumber
Manis. Apa yang saya cari. Terima kasih!
Francisco Quintero
5

Untuk mengirim keduanya xhr: truedan header, saya harus melakukan mis:

my_headers = { "HTTP_ACCEPT": "application/json" }
get my_path, xhr: true, headers: my_headers
Jim Stewart
sumber
1
Berikut kode sumbernya di GitHub: github.com/rails/rails/blob/…
Karl Wilbur
Tidak headers =seharusnya my_headers =?
webaholik
Tetap. Terima kasih @webaholik.
Jim Stewart
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"}}
Igor Escobar
sumber
2

Coba sesuatu seperti:

get :index, :format => 'json' 
gayavat
sumber
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