2010-03-01 12 views
31

Si el controlador de la acción tiene el siguiente aspecto:En Rails, ¿cómo comprueba la funcionalidad de un formato de respuesta de Javascript?

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

y su prueba de funcionamiento se parece a esto:

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 correr el controlador de la acción!

Respuesta

55

Pase un :format con sus parámetros normales para activar una respuesta en ese formato.

get :index, :format => 'js' 

No hay necesidad de meterse con los encabezados de su solicitud.

+2

Nota, en Rails 3 puede usar símbolos, se ve más ordenado. 'get: index, format:: js' – dazonic

+9

@dazonic ¿Estás seguro de que no se debe solo a Ruby 1.9? –

+0

actualizaciones de 2016: https://github.com/rspec/rspec-rails/issues/950. Se generará el error InvalidCrossOriginRequest. Use la respuesta de @steven a continuación :) –

3

Uso esto antes de solicitud:

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

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

@request.accept = "text/javascript" 

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

25

con rspec:

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

y en su acción de controlador:

1

Estos tres parecen ser equivalentes:

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

que 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"

Esto significa request.xhr? volverá verdadero.

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

get :index, format: "html"

analizadas en los carriles 3.0.3.

que tiene esta última de la fuente de Rails, aquí: https://github.com/rails/rails/blob/6c8982fa137421eebdc55560d5ebd52703b65c65/actionpack/lib/action_dispatch/http/request.rb#L160

+1

Para simular una solicitud XHR, en lugar de jugar con @ request.env, mejor usar el helper proporcionado: xhr: get,: index, format: "html" – Nick

0

Uso código como este para los parámetros y identificador de usuario, etc., observe que la opción de formato es 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 
0

Muchas de las respuestas anteriores están desactualizadas.

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

advertencia Deprecation 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, xhr :post, "some_path" resultados en algunos errores cobardes que no sucede con post some_path, xhr: true.

Cuestiones relacionadas