2011-07-05 3 views
2

J'essaie d'exécuter un test Capybara 1.0 sur mon application Rails 3 pour tester si un utilisateur clique sur un lien de confirmation, il est effectivement confirmé.Rails 3/Capybara n'enregistre pas les attributs du modèle

Maintenant, cela fonctionne réellement quand je le teste manuellement. De plus, comme vous pouvez le voir, il y a une ligne put @ user.confirmed que je mets dans la méthode confirm pour déboguer ceci, et elle imprime vrai quand j'exécute le test. Cependant, le test lui-même échoue.

Il semble que l'attribut confirmé dans mon modèle utilisateur ne soit pas retenu par le test après l'exécution de la méthode du contrôleur.

Qu'est-ce qui me manque? Merci beaucoup d'avance.

Test:

it "should allow a user to be confirmed after clicking confirmation link" do 
    fill_in('user_email', :with => '[email protected]') 
    click_button('Submit') 
    @user = User.find_by_email('[email protected]') 
    @user.confirmed.should be_false 
    visit confirm_path(@user.confirmation_code) 
    @user.confirmed.should be_true 
end 

méthode Contrôleur:

def confirm 
    @confirmation_code = params[:confirmation_code] 
    @user = User.find_by_confirmation_code(@confirmation_code) 
    @website = @user.website 
    @user.confirm 
    if @user.referrer_id 
     User.find(@user.referrer_id).increment_signups 
    end 
    flash[:success] = "Thanks for signing up!" 
    flash[:user_show] = @user.id 
      puts @user.confirmed 
    redirect_to "http://" + @website.domain_name 
end 

méthode modèle utilisateur:

def confirm 
    self.confirmed = true 
    self.save 
end 

Répondre

4

Est-ce que vous auriez besoin de recharger l'objet utilisateur après avoir visité le confirm_path? Essayez ceci:

it "should allow a user to be confirmed after clicking confirmation link" do 
    fill_in('user_email', :with => '[email protected]') 
    click_button('Submit') 
    @user = User.find_by_email('[email protected]') 
    @user.confirmed.should be_false 
    visit confirm_path(@user.confirmation_code) 
    @user = User.find_by_email('[email protected]') 
    @user.confirmed.should be_true 
end 

Vous pouvez également utiliser @user.reload.

L'objet utilisateur auquel vous faites référence dans votre test est simplement une copie de l'objet manipulé par l'application afin qu'il ne soit pas automatiquement actualisé. Vous devez le récupérer une deuxième fois dans la base de données pour obtenir les valeurs mises à jour.

+0

Oui! Maintenant, le test fonctionne. Merci beaucoup pour votre réponse rapide et précise! – Rebitzele

Questions connexes