ruby on rails - Envío de encabezados personalizados a través de RSpec
ruby-on-rails ruby-on-rails-3 (3)
Dada mi API, los consumidores deben enviar un encabezado HTTP de cliente como este:
# curl -H ''X-SomeHeader: 123'' http://127.0.0.1:3000/api/api_call.json
Entonces puedo leer este encabezado en un método before_filter como este:
# app/controllers/api_controller.rb
class ApiController < ApplicationController
before_filter :log_request
private
def log_request
logger.debug "Header: #{request.env[''HTTP_X_SOMEHEADER'']}"
...
end
end
Hasta ahora genial. Ahora me gustaría probar esto usando RSpec ya que hay un cambio en el comportamiento:
# spec/controllers/api_controller_spec.rb
describe ApiController do
it "should process the header" do
@request.env[''HTTP_X_SOMEHEADER''] = ''123''
get :api_call
...
end
end
Sin embargo, la request
recibida en ApiController no podrá encontrar la variable de encabezado.
Al intentar el same code
con el encabezado HTTP_ACCEPT_LANGUAGE, funcionará. ¿Los encabezados personalizados se filtran en alguna parte?
PD: Algunos ejemplos de la request
uso de la web en lugar de @request
. Aunque no estoy seguro de cuál es el correcto a partir de la combinación actual de Rails 3.2 / RSpec 2.14: ambos métodos no activarán el comportamiento correcto, PERO ambos funcionan con HTTP_ACCEPT_LANGUAGE
también.
Bueno, tal vez demasiado tarde para la gente pero solo para estar en fila:
it ''should get profile when authorized'' do
user = FactoryGirl.create :user
request.headers[EMAIL_TOKEN] = user.email
request.headers[AUTH_TOKEN] = user.authentication_token
get :profile
response.should be success
end
simplemente llame a request.headers con la configuración apropiada.
Las especificaciones de solicitud RSpec se modificaron en Rails 5, por lo que los headers
y params
ahora deben definirse usando argumentos hash de clave-valor. P.ej:
Antes en Rails 4 :
it "creates a Widget and redirects to the Widget''s page" do
headers = { "CONTENT_TYPE" => "application/json" }
post "/widgets", ''{ "widget": { "name":"My Widget" } }'', headers
expect(response).to redirect_to(assigns(:widget))
end
Ahora para Rails 5:
it "creates a Widget and redirects to the Widget''s page" do
headers = { "CONTENT_TYPE" => "application/json" }
post "/widgets", :params => ''{ "widget": { "name":"My Widget" } }'', :headers => headers
expect(response).to redirect_to(assigns(:widget))
end
Puedes definirlo en get
directamente.
get :api_call, nil, {''HTTP_FOO''=>''BAR''}
Acabo de verificar que funciona en consola.