2011-10-04 15 views
7

Estoy tratando de crear un proceso de inicio de sesión de rieles con un dispositivo que permita al usuario iniciar sesión/cerrar sesión a través de una aplicación móvil.Cómo probar el inicio de sesión de json en ingenio con rspec

he creado un SessionsController así:

class SessionsController < Devise::SessionsController 

    def create 
    resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#new") 
    set_flash_message(:notice, :signed_in) if is_navigational_format? 
    sign_in(resource_name, resource) 

    respond_to do |format| 
     format.html { super } 
     format.json { 
     render :status => 200, :json => { :error => "Success", :user => resource}.to_json 
     } 
    end 
    end 

    def destroy 
    super 
    end 
end 

Mis rutas:

devise_for :users, :controllers => {:sessions => "sessions"} 
resources :users 

Entonces tengo la siguiente especificación para probar el proceso:

require 'spec_helper' 

describe SessionsController do 

    describe "POST 'signin'" do 

    before (:each) do 
     @user = Factory(:user) 
    end 

    it "should login with json request" do 
     @expected = @user.to_json 

     post :create, :user => {:email => '[email protected]', :password => 'please'}, :content_type => 'application/json', :format => :json 
     response.body.should == @expected 
    end 

    end 

end 

Y tengo la siguiente error:

Failure/Error: post :create, :user => {:email => '[email protected]', :password => 'please'}, :content_type => 'application/json', :format => :json 
    AbstractController::ActionNotFound: 
     Could not find devise mapping for path "https://stackoverflow.com/users/sign_in.json?content_type=application%2Fjson&user%5Bemail%5D=user%40test.com&user%5Bpassword%5D=please". 
     Maybe you forgot to wrap your route inside the scope block? 

[EDITAR] Parece que la funcionalidad está bien, pero solo la prueba está rota; porque si me quedo este pequeño script:

require 'rest_client' 
require "active_support/core_ext" 

RestClient.post "http://localhost:3000/users/sign_in", {:user => {:email => '[email protected]', :password => 'please'}}.to_json, :content_type => :json, :accept => :json 

me sale el siguiente resultado:

"{\"error\":\"Success\",\"user\":{\"email\":\"[email protected]\",\"name\":\"First User\"}}" 

que es el esperado.

Respuesta

7

No sé si es la mejor solución, pero aquí es cómo puedo probar con éxito mi proceso de inicio de sesión JSON a través de servicios web en el legado:

require 'spec_helper' 
require 'rest_client' 
require 'active_support/core_ext' 

describe "sign up/sign out/sign in edit/cancel account" do 

before (:each) do 
    @user = {:name => "tester", :email =>"[email protected]"} 
end 

describe "POST 'sign up'" do 

    it "should sign up with json request" do 
    response_json = RestClient.post "http://localhost:3000/sign_up", {:user=>{:name=>"tester", :email => "[email protected]", :password => "FILTERED", :password_confirmation => "FILTERED"}}.to_json, :content_type => :json, :accept => :json 
    response = ActiveSupport::JSON.decode(response_json) 
    response["response"].should == "ok" 
    response["user"].should == @user.as_json 
    @@token = response["token"] 
    @@token.should_not == nil 
    end 

end 


describe "DELETE 'sign out'" do 

    it "should logout with json request" do 
    response_json = RestClient.delete "http://localhost:3000/users/sign_out?auth_token=#{@@token}", :accept => :json 
    response = ActiveSupport::JSON.decode(response_json) 
    response["response"].should == "ok" 
    end 

end 


describe "POST 'sign in'" do 

    it "should login with json request" do 
    response_json = RestClient.post "http://localhost:3000/users/sign_in", {:user => {:email => "[email protected]", :password => "FILTERED"}}.to_json, :content_type => :json, :accept => :json 
    response = ActiveSupport::JSON.decode(response_json) 
    response["response"].should == "ok" 
    response["user"].should == @user.as_json 
    @@token = response["token"] 
    @@token.should_not == nil 
    end 

end 


describe "PUT 'edit'" do 

    it "should edit user name with json request" do 
    response_json = RestClient.put "http://localhost:3000/users?auth_token=#{@@token}", {:user => {:name => "tester2", :email => "[email protected]", :current_password => "FILTERED"}}.to_json, :content_type => :json, :accept => :json 
    response = ActiveSupport::JSON.decode(response_json) 
    response["response"].should == "ok" 
    response["user"]["email"].should == "[email protected]" 
    response["user"]["name"].should == "tester2" 
    @@token = response["token"] 
    @@token.should_not == nil 
    end 

end 


describe "DELETE 'account'" do 

    it "should logout with json request" do 
    response_json = RestClient.delete "http://localhost:3000/users?auth_token=#{@@token}", :accept => :json 
    response = ActiveSupport::JSON.decode(response_json) 
    response["response"].should == "ok" 
    end 

end 
end 

Con que puedo crear un nuevo usuario, cierre la sesión, registro de nuevo, edite la cuenta y elimine la cuenta. Todo a través de 5 servicios web en json. Este orden de ejecución permite que las pruebas se reproduzcan todo el tiempo, pero creo que falta un verdadero proceso de reversión que se ejecutará al final de la campaña.

+0

parece que localhost: 3000 necesita ser encendido para la prueba? – Karan

+0

Sí: utilizo la protección para vigilar las modificaciones y ejecutar las pruebas durante el desarrollo, por lo que localhost: 3000 siempre está encendido. – obo

Cuestiones relacionadas