ruby-on-rails ruby-on-rails-3 rspec rspec-rails

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.