2011-05-13 5 views
15

Tengo un controlador de grupos con un método def inbox.¿Cómo creo una prueba de rspec que valida una respuesta JSON?

Si el usuario es un miembro del grupo, entonces la bandeja de entrada devuelve un objeto JSON.

Si el usuario no es miembro, entonces la bandeja de entrada debe redireccionar gracias a los permisos CanCan.

¿Cómo escribo un rspec para probar estos dos casos de uso?

especificación actual:

require 'spec_helper' 

describe GroupsController do 
    include Devise::TestHelpers 

    before (:each) do 
    @user1 = Factory.create(:user) 
    @user1.confirm! 
    sign_in @user1 
    @group = Factory(:group) 
    @permission_user_1 = Factory.create(:permission, :user => @user1, :creator_id => @user1.id, :group => @group) 
    end 

    describe "GET inbox" do 
    it "should be successful" do 
     get inbox_group_path(@group.id), :format => :json 
     response.should be_success 
    end 
    end 
end 

Rutas:

inbox_group GET /groups/:id/inbox(.:format) {:controller=>"groups", :action=>"inbox"} 

Rutas de archivos:

resources :groups do 
    member do 
    get 'vcard', 'inbox' 
    end 
    .... 
end 

Respuesta

35

Esto es cómo hacer esto:

describe "GET index" do 
    it "returns correct JSON" do 
    # @groups.should have(2).items 
    get :index, :format => :json 
    response.should be_success 
    body = JSON.parse(response.body) 
    body.should include('group') 
    groups = body['group'] 
    groups.should have(2).items 
    groups.all? {|group| group.key?('customers_count')}.should be_true 
    groups.any? {|group| group.key?('customer_ids')}.should be_false 
    end 
end 

No estoy usando cancan, por lo tanto, no puedo ayudar con esta parte.

+0

Gracias Intenté pero recibo un error: "Error/error: get: inbox,: format =>: json ActionController :: RoutingError: No coincide la ruta {: controller =>" groups ",: format => : JSON,: action => "bandeja de entrada"} # ./controllers/groups_controller_spec.rb:19 "Lo que es extraño teniendo en cuenta las rutas de rastrillo rendimientos: inbox_group GET /groups/:id/inbox(.:format) {: controlador = > "grupos",: acción => "bandeja de entrada"} – AnApprentice

+1

intenta proporcionar la ruta para obtener con url_for - http://apidock.com/rails/ActionDispatch/Integration/RequestHelpers/get – Roman

+0

¿Qué aspecto tendría? – AnApprentice

0

Afirmar JSON se puede hacer esto también:

ActiveSupport::JSON.decode(response.body).should == ActiveSupport::JSON.decode(
    {"error" => " An email address is required "}.to_json 
) 

This blog ofrece algunas ideas más.

2

Prueba esto:

_expected = {:order => order.details}.to_json 
response.body.should == _expected 
2

A veces puede ser lo suficientemente bueno para verificar si response contiene JSON válida, aquí está un ejemplo:

it 'responds with JSON' do 
    expect { 
    JSON.parse(response.body) 
    }.to_not raise_error 
end 
1

Creo que lo primero que quiere hacer es para comprobar que la respuesta es del tipo correcto, es decir, que tiene el encabezado Content-Type establecido en application/json, algo similar a:

it 'returns JSON' do 
    expect(response.content_type).to eq(Mime::JSON) 
end 

Luego, dependiendo de su caso, es posible que desee comprobar si la respuesta se puede analizar como JSON, como wik sugirió:

it 'responds with JSON' do 
    expect { 
    JSON.parse(response.body) 
    }.to_not raise_error 
end 

Y se podría fusionar los dos anteriores en una sola prueba si se siente como dos pruebas para verificar la validez de respuesta JSON son demasiado.

Cuestiones relacionadas