Rspec istek spesifikasyonunda istek başlıkları nasıl ayarlanır?


127

Denetleyici spesifikasyonunda, http kabul başlığını şu şekilde ayarlayabilirim:

request.accept = "application/json"

ancak istek belirtiminde "istek" nesnesi sıfırdır. Peki bunu burada nasıl yapabilirim?

Http kabul başlığını json olarak ayarlamak istememin nedeni, bunu yapabilmem:

get '/my/path'

bunun yerine

get '/my/path.json'

Yanıtlar:


130

HTTP üst bilgilerini, burada açıklandığı gibi get () yönteminizin üçüncü bağımsız değişkeni olarak belirtebilmeniz gerekir:

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

ve burada

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

Yani, bunun gibi bir şey deneyebilirsiniz:

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

3
'HTTP_ACCEPT' kullanmamız gerekiyordu: get '/my/path', nil, {'HTTP_ACCEPT' => "application/json"}
Matt Scilipoti

58
NOT: Bu, aşağıdaki yoruma benzer şekilde entegrasyon testi içindir, rspec-rails denetleyici testlerinde şunu kullanırsınız: request.env ["HTTP_ACCEPT"] =
Alex Soto

5
Ben aptal olduğum için karşılaştığım küçük bir şey var: Başlık anahtarları Strings olmalı. Semboller görünmeyecek.
ajmurmann

@ajmurmann Artık semboller işe yarıyor: "Yetkilendirme" başlığı olabilir :authorization.
Franklin Yu

13
Yeni RSspec 3 sözdizimi şöyle olacaktır: get my_resource_path, params: {}, headers: { 'HTTP_ACCEPT' => "application/json" }``
Cyril Duchon-Doris

39

Bunu Test :: Unit'de kullandım:

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

3
Benzer şekilde, Alex Soto'nun başka bir cevapla ilgili bir yorumda belirttiği gibi, rspec-rails kontrolör testlerinde şunu kullanabilirsiniz: request.env ["HTTP_ACCEPT"]
gerry3

Çok teşekkürler dostum, benim için eski bir 2.3 uygulamasında işe yarayan tek örnekActionController::TestCase
ekolojik

+1 CookieBaşlık karmasında adı verilen bir anahtarı kullanmayı denedim (çünkü tarayıcımın gönderdiği budur), ancak işe yaramadı. Sonra yaptım request.keysve adlı bir anahtar gördüm HTTP_COOKIE. Bunu kullanmak işe yaradı. Bunu gerçekten daha iyi belgelemeliler.
Kelvin


@Sytse Sijbrandij Kimse Test :: Unit'i sormadı. Rspec hakkında soru soruldu.
Bryan Dimas

19

Bu, denetleyici özellikleri için çalışıyor, teknik özellikler için değil:

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

2
Bu benim için çalıştı, kullanıyorsanız başlıkları nasıl aldığınıza bağlı request.headersveyarequest.env
Edgar Ortega

3
Not: Bu, soruda bahsedilen entegrasyon testleri değil, kontrolör testleri içindir.
Franklin Yu

3
entegrasyon testleri için çalışmadı. Bununla birlikte, kontrolör testleriyle çalışır.
Petr Gazarov

18

Bunu Rails 5.1.rc1'de yapmaya çalışırken büyük ölçüde takılıp kaldığım için buraya ekliyorum

Get yöntemi imzası artık biraz farklı.

Yoldan sonraki seçenekleri anahtar kelime argümanları olarak belirtmeniz gerekir, yani

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

Bilginize, anahtar kelime bağımsız değişkenlerinin tamamı şunlardır:

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


9

Üstbilgileri ayrı ayrı ayarlamam gerekiyor

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

Get / delete / .... ile göndermeye çalışmak, rails4'te tam anlamıyla çöp ve kafamda ağrıya neden oluyor çünkü hiçbir zaman başlık olarak değil parametre olarak gönderiliyor.

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

5
Bu gerçekten OP sorusuna bir cevap sağlıyor mu? Yeni bir soru ise, yeni bir soru açmak daha iyi bir fikirdir.
β.εηοιτ.βε




2

Sorunuz zaten yanıtlanmıştı ancak başka bir eyleme bir şey YAYINLAMAK isterseniz, bunu yapmanız gerekir:

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

2

Şöyle bir şey dene:

get :index, :format => 'json' 

Emin değilim, ancak muhtemelen işe yarıyor çünkü raylar o rota için .format arıyor; bu benim için de işe yaradı.
Alan

2
Herhangi birinin merak etmesi durumunda, bu sadece format=jsonsorgu parametresi olarak eklenir . Başlık alanıyla aynı değildir.
Kevin Carmody
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.