3

Mon users_controller.rbComment stub un users_controller | authlogic, rspec2, rails3, factory_girl

# GET /users/1/edit 
def edit 
    @user = current_user 
    #@user = User.find(params[:id]) 
end 

mon users_controller_spec.rb doux A la recherche (notez tous mes commentaires sur les tentatives)

describe "Authenticated examples" do 
    before(:each) do 
    activate_authlogic 
    UserSession.create Factory.build(:valid_user) 
    end 

describe "GET edit" do 
    it "assigns the requested user as @user" do 
    @user = Factory.create(:valid_user) 
    assigns(:user).should be(Factory.build(:valid_user)) 
    end 
end 

de user.rb - usines

Factory.define :valid_user, :class => User do |u| 
    u.username "Trippy" 
    u.password "password" 
    u.password_confirmation "password" 
    u.email "[email protected]" 
    u.single_access_token "k3cFzLIQnZ4MHRmJvJzg" 
end 

Fondamentalement, j'essaie simplement de faire passer ce test RSpec de la manière la plus appropriée.

Je dois pouvoir dire très simplement, que le mock_user est le current_user.

Ce test passe si je l'utilise dans mon users_controller.rb le @user = User.find(params[:id])

Merci !!

Répondre

3

Je Je ne suis pas sûr si cela s'applique à Rspec 2, mais selon les documents Authlogic, vous devez mettre cela dans unméthode, ou spec_helper:

include Authlogic::TestCase 
activate_authlogic 

Et vous pouvez créer des sessions utilisateur comme vous le feriez en dehors de l'environnement de test. FWIW J'ai renoncé au moqueur/stubbing dans les exemples Authlogic, et je fais @user = Factory.create(:user), qui sont ensuite connectés avec UserSession.create (@user).

EDIT

est ici une tentative en utilisant l'exemple que vous avez fourni. Je pense que le problème que vous avez est que l'objet dans assigns n'est pas le même que celui sur lequel vous faites correspondre.

describe "Authenticated examples" do 
    before(:each) do 
    # assuming you put include Authlogic::TestCase in spec_helper 
    activate_authlogic 
    @user = Factory.create(:valid_user) 
    UserSession.create(@user) 
    end 

describe "GET edit" do 
    it "assigns the requested user as @user" do 
    # add a MyModel.stub!(:find) here if the edit action needs it 
    get :id => 1 # pass in an ID so the controller doesn't complain 
    assigns(:user).should == @user 
    end 
end 
+0

J'ai le 'include Authlogic :: TestCase' dans mon spec_helper. Le activate_authlogic dans mon avant (: chaque) comme ci-dessus. Je ** suis ** essayant d'utiliser l'usine pour rendre l'utilisateur. Et d'un de mes exemples ci-dessus, est très proche de la vôtre. Je devine que maintenant, mon problème vient d'un problème syntaxique. Ha! Souhaitez-moi bonne chance;) – Trip

+0

J'ai mis à jour mon scénario ci-dessus. ;) – Trip

+0

En regardant le code mis à jour, avez-vous omis le 'get'? En outre, il semble que le résultat de 'Factory.build (: valid_user)' sera différent après chaque appel, à moins que vous ayez une sorte de motif singleton au travail dans l'usine. – zetetic

1

Tous sont sur cette page:

http://rdoc.info/github/binarylogic/authlogic/master/Authlogic/TestCase

Vous devez mettre un peu d'informations:

require "authlogic/test_case" # include at the top of test_helper.rb 
    setup :activate_authlogiC# run before tests are executed 
    UserSession.create(users(:whomever)) # logs a user in 

Inf ce cas, vous avez juste besoin de changer votre users(:whomever) par votre mock_user

+0

Right..tried aussi. pas d'offres. – Trip

+0

@hingara, mis à jour mon code ci-dessus, mais je semble avoir des problèmes avec la syntaxe correcte .. – Trip

4

Il y a un bogue dans rspec-rails (voir https://github.com/rspec/rspec-rails/issues/391) qui brise activate_authlogic lorsqu'il est utilisé globale avant crochet de RSpec.

Au lieu de

# spec_helper.rb 

# In RSpec.configure 
config.before :each, :type => :controller do 
    activate_authlogic 
    user = User.new(:login => "user", :password => "secret") 
    UserSession.create(user) 
end 

vous pouvez définir une aide

# spec_helper.rb 

require 'authlogic/test_case' 
module LoginHelper 
    include Authlogic::TestCase 

    def login_user 
    activate_authlogic 
    user = User.new(:login => "user", :password => "secret") 
    UserSession.create(user) 
    end 
end 

et la référence dans un bloc avant en cas de besoin

# <controller>_spec.rb 

describe "GET 'edit' when logged in" do 
    before do 
    login_user 
    end 

    it "should be successful" do 
    get 'edit' 
    response.should be_success 
end 
+0

Vous pouvez également définir un contexte partagé. – trkoch

+1

Bonne réponse. Mais vous devez mettre 'include LoginHelper' au début de votre test. – phatmann

Questions connexes