2012-03-30 9 views
6

Estoy buscando una forma limpia de usar JBuilder y probar la salida json con RSpec. La forma más común para las pruebas JSON es implementar el método as_json, y luego en RSpec comparar el objeto recibido con el método object.to_json. Pero una gran razón por la que estoy usando JBuilder es que no quiero todos los atributos que to_json escupe; entonces esto rompe la comparación.¿Cómo usar RSpec con JBuilder?

Actualmente con JBuilder estoy tener que hacer lo siguiente para probar los resultados RSpec:

1) Crear un objeto de fábrica: @venue

2) Crear un hash dentro de mi prueba RSpec que contiene el "espera" cadena JSON

@expected => {:id => @venue.id,:name=>@venue.name..........} 

2) Comparar la cadena @expected a la results.response.body que se devuelve desde la llamada JSON.

Esto parece simple, excepto que tengo objetos renderizados con más de 15 atributos, y construir la cadena de hash @expected es engorroso y muy frágil. ¿Hay una mejor manera de hacer esto?

+0

He estado haciendo exactamente eso. No puedo pensar en una mejor manera de hacerlo. Construí un hash y aplico '.to_json' en el' @ expected'. Una cosa que hago es acelerar esto y hacerlo menos quebradizo. ¿Tal vez a costa de la precisión? Es construir mis valores hash con recolección y mapa. Supongo que la naturaleza específica de crear una plantilla personalizada con cualquier biblioteca de construcción de cadenas JSON requiere que escriba una prueba que coincida con los detalles del trabajo que realiza ...:/ – stuartc

+0

@beeudoublez ¿puede usar RSpec para probar las vistas de jbuilder? Tengo problemas para conseguir que rspec pase objetos a la vista para que el manejador jbuilder construya el JSON. ¿Tiene un ejemplo de archivo de vista de trabajo '* _spec.rb'? – sorens

Respuesta

4

Usted debe ser capaz de probar sus puntos de vista de JBuilder con vistas RSpec especificaciones. Puede ver los documentos en https://www.relishapp.com/rspec/rspec-rails/v/2-13/docs/view-specs/view-spec.

Una especificación de ejemplo para un archivo ubicado en 'app/views/api/users/_user.json.jbuilder', podría ser algo como esto (spec/views/api/users/_user.json.jbuilder_spec.rb) :

require 'spec_helper' 

describe 'user rendering' do 
    let(:current_user) { User.new(id: 1, email: '[email protected]') } 

    before do 
    view.stub(:current_user).and_return(current_user) 
    end 

    it 'does something' do 
    render 'api/users/user', user: current_user 

    expect(rendered).to match('[email protected]') 
    end 
end 
1

Esto suena como un buen caso de uso para las especificaciones de vista RSpec. ¿Estás usando JBuilder para la salida de un controlador en vistas?

Por ejemplo, en la especificación/views/venues_spec.rb

require 'spec_helper' 
describe "venues/show" do 
    it "renders venue json" do 
    venue = FactoryGirl.create(:venue) 
    assign(:venue, venue]) 
    render 
    expect(view).to render_template(:partial => "_venue") 
    venue_hash = JSON.parse(rendered) 
    venue_hash['id'].should == @venue.id 
    end 
end 
1

no he sido capaz de hacer RSpec trabajar con los puntos de vista, sin embargo, pero estoy probando mi API JSON a través de pruebas RSpec controlador. Para ayudar con este proceso, estoy usando el api matchers gem. Esta joya le permite construir pruebas RSpec como:

it "should have a 200 code" do 
    get :list, :format => :json 
    response.should be_success 
    response.body.should have_json_node(:code).with("200") 
    response.body.should have_json_node(:msg).with("parameter missing") 
end 
1

no me gusta probar la API JSON a través de los puntos de vista, ya que hay que imitar esencialmente, en la prueba, la instalación ya realizada en el controlador. Además, sin pasar por el controlador, realmente no está probando la API.

En las pruebas de controlador, sin embargo, encontrará que no obtiene ningún JSON devuelto en el cuerpo de la respuesta. El cuerpo de respuesta está vacío. Esto se debe a que RSpec desactiva la representación de la vista en las pruebas de controlador. (Para bien o para mal.)

Para tener una prueba de controlador RSpec de su vista representa API JSON, debe agregar la directiva render_views en la parte superior de la prueba. Consulte this blog post (no el mío) para obtener información más detallada sobre el uso de las pruebas del controlador RSpec con Jbuilder.

También, vea this answer.