2011-04-23 2 views
8

concevoir [... Ok ma première question, alors soyez gentil.]problème « post créer » dans mon contrôleur rspec

J'utilise l'authentification pour mon concevoir, mais j'ai mon propre contrôleur d'étendre ce qui se passe lorsque l'utilisateur est créé. Je crée à la fois un "utilisateur" et une "agence" au moment de l'inscription (inscription).

Itinéraires ...

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

Mon contrôleur complet ...

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 

Mon problème est que je veux mettre en place un rspec pour vérifier ce code. Le code semble fonctionner, mais je tire pour 100% de couverture de code dans mes spécifications. Voici mes spécifications entières ...

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 

Mais, je reçois une erreur sur le "post-créer". Voici le message d'erreur

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

Et cela (je pense) la ligne correspondante de "routes râteau"

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

Toutes les pensées?

pat

+2

J'ai découvert (par essai et erreur) que l'ajout de la ligne request.env [ "devise.mapping"] = Devise.mappings [: user] à l'épreuve de spécification fait ce test à exécuter maintenant. Mais je ne comprends pas vraiment ce que cette ligne fait - donc les commentaires seraient appréciés. – Pat

Répondre

11

Plus précisément, la copie un extrait du lien référencé par @shanethehat, la ligne

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

résout le problème posé dans la question. Laissez tomber cette ligne dans un before_filter pour votre test de contrôleur Devise-aromatisé. Changer :admin à la ressource en question (communément :user)

La raison qui est des travaux: La description d'un seul SessionsController ne permettent pas d'isoler une ressource spécifique Devise. Par exemple, si votre application dispose des ressources admin et user, vous pouvez avoir 2 SessionsController (s) avec 2 ensembles de spécifications - un pour chaque type de ressource.

Dans ce cas, pour que chaque test fonctionne sur la bonne ressource, vous devez indiquer à Devise lequel de vos SessionsController (s) vous voulez dire pour chaque ensemble d'exemples. La ligne ci-dessus fait juste cela.

Questions connexes