Jak ustawić nagłówki żądań w specyfikacji żądania rspec?


127

W specyfikacji kontrolera mogę ustawić nagłówek http accept w następujący sposób:

request.accept = "application/json"

ale w specyfikacji żądania obiekt „request” jest zerowy. Więc jak mogę to zrobić tutaj?

Powodem, dla którego chcę ustawić nagłówek http accept na json, jest to, że mogę to zrobić:

get '/my/path'

zamiast tego

get '/my/path.json'

Odpowiedzi:


130

Powinieneś móc określić nagłówki HTTP jako trzeci argument metody get (), jak opisano tutaj:

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

i tu

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

Możesz więc spróbować czegoś takiego:

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

3
Musieliśmy użyć „HTTP_ACCEPT”: get '/my/path', nil, {'HTTP_ACCEPT' => "application/json"}
Matt Scilipoti,

58
UWAGA: To służy do testowania integracji, podobnie jak w komentarzu poniżej, w testach kontrolera rspec-rails należy użyć: request.env ["HTTP_ACCEPT"] =
Alex Soto,

5
Mała wpadka, na którą wpadłem, ponieważ jestem głupi: klucze nagłówka muszą być ciągami. Symbole nie pojawią się.
ajmurmann

@ajmurmann Teraz działają symbole: nagłówek „Authorization” może być :authorization.
Franklin Yu

13
Nowa składnia RSspec 3 byłaby następująca: get my_resource_path, params: {}, headers: { 'HTTP_ACCEPT' => "application/json" }`
Cyril Duchon-Doris

39

Użyłem tego w Test :: Unit:

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

3
Podobnie, jak zauważa Alex Soto w komentarzu do innej odpowiedzi, w testach kontrolera rspec-rails możesz użyć: request.env ["HTTP_ACCEPT"]
gerry3

wielkie dzięki koleś, jedyny przykład, który działał dla mnie na starej aplikacji 2.3 zActionController::TestCase
ecoologic

+1 Próbowałem użyć klucza nazwanego Cookiew skrócie nagłówków (ponieważ tak wysyła moja przeglądarka), ale to nie zadziałało. Potem zrobiłem request.keysi zobaczyłem klucz o nazwie HTTP_COOKIE. Używanie tego zadziałało. Naprawdę powinni lepiej to udokumentować.
Kelvin,

To naprawdę działa! Znalazłem również tę odpowiedź na github.com/rspec/rspec-rails/issues/65
Stepan Zakharov

@Sytse Sijbrandij Nikt nie pytał o Test :: Unit. Pytanie zadane o rspec.
Bryan Dimas

18

Dodam to tutaj, ponieważ utknąłem, próbując to zrobić w Railsach 5.1.rc1

Podpis metody get jest teraz nieco inny.

Musisz określić opcje po ścieżce jako argumenty słów kluczowych, tj

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

FYI, pełny zestaw argumentów słów kluczowych to:

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


18

To działa dla specyfikacji kontrolera, a nie specyfikacji żądań:

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

2
To zadziałało dla mnie, zależy to od tego, jak odzyskujesz nagłówki, jeśli używasz request.headerslubrequest.env
Edgar Ortega

3
Uwaga: dotyczy to testów kontrolera, a nie testów integracji, o których mowa w pytaniu.
Franklin Yu

3
nie działa dla testów integracyjnych. Działa jednak z testami kontrolera.
Petr Gazarov

9

Muszę oddzielnie ustawić nagłówki

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

Próba wysłania go przez get / delete / .... jest kompletnym śmieciem w rails4 i powoduje ból w mojej głowie, ponieważ nigdy nie jest wysyłany jako nagłówek, ale jako parametr.

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

5
Czy to naprawdę daje odpowiedź na pytanie PO? Jeśli jest to nowe pytanie, lepiej jest otworzyć nowe pytanie.
β.εηοιτ.βε




2

Twoje pytanie zostało już udzielone, ale jeśli chcesz POST coś do innej akcji, musisz to zrobić:

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

2

Spróbuj czegoś takiego:

get :index, :format => 'json' 

Nie jestem pewien, ale prawdopodobnie działa, ponieważ szyny szukają formatu .format dla tej trasy; to też zadziałało na mnie.
Alan

2
Jeśli ktoś się zastanawia, dodaje to po prostu format=jsonjako parametr zapytania. To nie to samo, co pole nagłówka.
Kevin Carmody
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.