Pregunta

Si el controlador de acción es similar al siguiente:

respond_to do |format|
  format.html { raise 'Unsupported' }
  format.js # index.js.erb
end

y su apariencia de pruebas funcionales como esta:

test "javascript response..." do
  get :index
end

se ejecutará la rama HTML del bloque respond_to.

Si intenta esto:

test "javascript response..." do
  get 'index.js'
end

se ejecuta la vista (index.js.erb) sin ejecutar la acción del controlador!

¿Fue útil?

Solución

Pass en un :format con sus parametros normales para desencadenar una respuesta en ese formato.

get :index, :format => 'js'

No hay necesidad de meterse con las cabeceras de solicitud.

Otros consejos

con rspec:

it "should render js" do
  xhr :get, 'index'
  response.content_type.should == Mime::JS
end

y en su acción de controlador:

respond_to do |format|
  format.js
end

Configurar el contenido de tipo aceptado para el tipo que desee:

@request.accept = "text/javascript"

Combinar esto con su prueba get :index y que hará que la llamada adecuada al controlador.

Utilice esta solicitud antes:

@request.env['HTTP_ACCEPT'] = 'text/javascript'

Estos tres parecen ser equivalentes:

  1. get :index, :format => 'js'
  2. @request.env['HTTP_ACCEPT'] = 'text/javascript'
  3. @request.accept = "text/javascript"

Causan el controlador para usar una plantilla js (por ejemplo index.js.erb)

Mientras que la simulación de una solicitud XHR (por ejemplo, para obtener un fragmento de HTML) que puede utilizar esto: @request.env['HTTP_X_REQUESTED_WITH'] = "XMLHttpRequest"

Este medio de request.xhr? devolverá true.

Tenga en cuenta que, cuando se simula XHR, tuve que especificar el formato esperado o me da un error:

get :index, format: "html"

Probado en Rails 3.0.3.

Me consiguió el último de la fuente de rieles, aquí: https://github.com/rails/rails/blob/6c8982fa137421eebdc55560d5ebd52703b65c65/actionpack/lib/action_dispatch/http/request.rb#L160

RSpec 3,7 y rieles 5.x solución:

Algunas de estas respuestas fueron un poco anticuado en mi caso, así que decidí dar una respuesta a los carriles de rodadura 5 y RSpec 3.7:

it "should render js" do
  get :index, xhr: true

  expect(response.content_type).to eq('text/javascript')
end

Muy similar a la de Steve respuesta con algunos ajustes. El primer ser xhr se pasa como una clave boolean / pair. En segundo lugar es ahora uso expect debido a should recibir avisos de desaprobación si se utiliza. Comparando el content_type de que la respuesta sea igual a text/javascript trabajó para mí.

Usar código como este para los parámetros y los ID de usuario, etc., aviso de que la opción de formato se encuentra en el mismo hash de otros parámetros como la identificación y nested_attributes.

put :update, {id: record.id, nested_attributes: {id: 1, name: "John"}, format: :js}, user.id

Muchas de las respuestas anteriores son obsoletas.

La forma correcta de hacerlo en RSpec 3+ es post some_path, xhr: true.

Deprecation advertencia directamente de sí RSpec, al intentar utilizar xhr :post, "some_path":

DEPRECATION WARNING: `xhr` and `xml_http_request` are deprecated and will be removed in Rails 5.1.
Switch to e.g. `post comments_path, params: { comment: { body: 'Honey bunny' } }, xhr: true`.

Además, los resultados xhr :post, "some_path" en algunos errores cobardes que no sucede con post some_path, xhr: true.

he tenido un problema similar:

# controller
def create
  respond_to do |format|
    format.js
  end
end

# test

test "call format js" do
  record = promos(:one)
  post some_url(record)
  assert true
end

y el resultado fue el siguiente:

> rails test
Error:
ActionController::UnknownFormat: ActionController::UnknownFormat

I fijo que con este ajuste a la prueba (cabeceras adición):

test "call format js" do
  record = promos(:one)
  headers = { "accept" => "text/javascript" }
  post some_url(record), headers: headers
  assert true
end

carriles (6.0.0.beta3)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top