2011-04-23 7 views
8

[Ok ... mi primera pregunta, así que se gentil.]Problema con "post crear" en mi controlador legado rspec

estoy usando para mi idear autenticación, pero tengo mi propio controlador para extender lo que sucede cuando el usuario es creado Estoy creando tanto un "usuario" como una "agencia" en el momento del registro (registro).

En las rutas ...

devise_for :users, :controllers => {:registrations => "registrations"} 

Mi controlador completo ...

class RegistrationsController < Devise::RegistrationsController 
    def create 
    super # creates the @user 
    @agency = Agency.create! params[:agency] 
    @agency.users << @user 
    @agency.owner = @user 
    @user.agency = @agency 
    @agency.save 
    @user.account_admin = true 
    @user.save 
    end 
end 

Mi problema es que quiero establecer un rspec para comprobar este código. El código parece estar funcionando, pero estoy filmando para una cobertura de código del 100% en mis especificaciones. Aquí está mi especificación completa ...

require 'spec_helper' 
describe RegistrationsController do 
    render_views 
    describe "POST create" do 
    it "creates an associated user" do 
     @agency = Factory.create(:agency) 
     @user = Factory.create(:user, :agency => @agency) 
     User.stub(:new).with({'name' => 'pat'}) { @user } 
     Agency.stub(:new).with({'name' => 'pat'}) { @agency } 
     post :create, :user => {'name' => 'pat'} 
     assigns(:user).should be(@user) 
    end 
    end 
end 

Pero me aparece un error en la "publicación posterior". Aquí está el mensaje de error

Could not find devise mapping for path "/users?user[name]=pat" 

Y esto es (creo) la línea relevante de rutas "rastrillo"

user_registration POST /users(.:format) {:action=>"create",:controller=>"registrations"} 

Cualquier pensamiento?

pat

+2

he descubierto (por ensayo y error) que la adición de la línea request.env [ "devise.mapping"] = Devise.mappings [: user] a la prueba spec hace que prueba ahora a ejecutar. Pero realmente no entiendo lo que hace esa línea, por lo que los comentarios serían apreciados. – Pat

Respuesta

11

En concreto, la copia de un fragmento del enlace al que hace referencia @shanethehat, la línea

@request.env["devise.mapping"] = Devise.mappings[:admin] 

resuelve el problema planteado en la pregunta. Simplemente coloque esa línea en before_filter para su prueba de controlador con sabor Devise. :admin cambiar al recurso en cuestión (comúnmente :user)

La razón por la que se trabaja: Descripción de una sola SessionsController no identifica de forma única un recurso Diseñar específica. Por ejemplo, si su aplicación tiene recursos admin y user, le gustaría tener 2 SessionsController (s) con 2 conjuntos de especificaciones, una para cada tipo de recurso.

En ese caso, para que cada prueba opere con el recurso correcto, necesita decirle a Diseñar cuál de sus SessionsController (s) significa para cada conjunto de ejemplos. La línea de arriba hace exactamente eso.

Cuestiones relacionadas