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'
Siergiej
źródło

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"}
awaage
źródło
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
Sytse Sijbrandij
źródło
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

Jules Copeland
źródło
18

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

request.headers["My Header"] = "something"
morgoth
źródło
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"}
user4694178
źródło
5
Czy to naprawdę daje odpowiedź na pytanie PO? Jeśli jest to nowe pytanie, lepiej jest otworzyć nowe pytanie.
β.εηοιτ.βε
9

Używanie rspec z Rack::Test::Methods

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

Zmienna nagłówka przejdzie jako X-Your-Header-Var

marcusb
źródło
Uwaga: to jest dla Test::Unit, a nie dla RSpec.
Franklin Yu
jego wskazujący rspec
James Tan
1
Tak. W rspec powoduje to ndefined method 'header'dla mnie błąd.
Евгений Масленков
7

Z RSpec 3 możesz użyć następującej składni

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

Jak opisano w oficjalnej dokumentacji Rspec (odsyłacz prowadzi do wersji 3.7)

Cyril Duchon-Doris
źródło
Słodkie. Właśnie tego szukałem. Dzięki!
Francisco Quintero
5

Aby wysłać oba xhr: truei nagłówki, musiałem zrobić np:

my_headers = { "HTTP_ACCEPT": "application/json" }
get my_path, xhr: true, headers: my_headers
Jim Stewart
źródło
1
Oto kod źródłowy na GitHub: github.com/rails/rails/blob/…
Karl Wilbur
Nie powinno headers =być my_headers =?
webaholik
Naprawiony. Dzięki @webaholik.
Jim Stewart,
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"}}
Igor Escobar
źródło
2

Spróbuj czegoś takiego:

get :index, :format => 'json' 
gayavat
źródło
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