2014-05-25 6 views
0

Je suis bloqué (encore!) Au chapitre 9 (cette fois-ci dans la section 9.2.2) du tutoriel Rails. Je reçoisTutoriel Rails: méthode non définie

bundle exec rspec spec/ 
................................FFF........................ 

Failures: 

1) Authentication authorization as wrong user submitting a GET request to the Users#edit action 
Failure/Error: before {sign_in user, no_capybara: true} 
NoMethodError: 
    undefined method `new_remember_token' for #<User:0x007f8181815448> 
# ./spec/support/utilities.rb:13:in `sign_in' 
# ./spec/requests/authentication_pages_spec.rb:71:in `block (4 levels) in <top (required)>' 

Les 2 autres erreurs sont du même type.

est à l'origine spec Voici les erreurs:

describe "as wrong user" do 
     let(:user) {FactoryGirl.create(:user)} 
     let(:wrong_user) {FactoryGirl.create(:user, email: "[email protected]")} 
     before {sign_in user, no_capybara: true} 

     describe "submitting a GET request to the Users#edit action" do 
     before {get edit_user_path(wrong_user)} 
     specify { expect(response.body).not_to match(full_title('Edit user'))} 
     specify { expect(response).to redirect_to(root_url)} 
     end 

     describe "submitting a PATCH request to the Users#update action" do 
     before { patch user_path(wrong_user)} 
     specify { expect(response).to redirect_to(root_url)} 
     end 
    end 

Et est la méthode ici (de utilities.rb) le message d'erreur se plaint:

def sign_in (user, options={}) 
    if options[:no_capybara] 
    # Sign in when not using Capybara 
    remember_token = User.new_remember_token 
    cookies[:remember_token] 
    user.update_attribute(:remember_token, User.digest(remember_token)) 
    else 
    visit signin_path 
    fill_in "Email", with: user.email 
    fill_in "Password", with: user.password 
    click_button "Sign in" 
    end 
end 

Le code pour le modèle (l'utilisateur. rb) est ici:

class User < ActiveRecord::Base 
before_save { self.email = email.downcase} 
before_create :create_remember_token 
validates :name, presence: true, length: { maximum: 50 } 
VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: { case_sensitive: false } 
validates :password, length: {minimum: 6} 
has_secure_password 

def User.new_remember_token 
    SecureRandom.urlsafe_base64 
end 

def User.digest(token) 
    Digest::SHA1.hexdigest(token.to_s) 
end 

private 
    def create_remember_token 
    self.remember_token = User.digest(User.new_remember_token) 
    end 
end 

J'avais déjà des problèmes avec la méthode sign_in mais miraculously disappeared. Qu'est-ce que je fais mal?

Répondre

0

J'ai finalement trouvé le coupable pour les résultats de test erratiques que j'ai observé dans ce cas et, très probablement, lors d'occasions précédentes (Failure/Error: sign_in user undefined method `sign_in', Rails named route not recognized). Le problème semble être que les rails ne supprime pas par défaut le cache entre les tests. Ce qui est, en fait, carrément effrayant. Il semble que vous ne pouvez pas vraiment faire confiance aux résultats du test. Je me suis rendu compte en commentant la méthode que les rails se plaignaient et en relançant le test. L'erreur persistait, ce qui signifiait une chose - rspec travaillait simplement avec des versions en cache des fichiers et ignorait donc les changements que je faisais. Donc, même si les tests passent, vous ne pouvez pas être sûr qu'ils le font vraiment. C'est vraiment bizarre. Après avoir réalisé le problème avec un peu de googling, j'ai trouvé comment forcer les rails à nettoyer le cache - vérifiez la réponse de jaustin ici: is Rails.cache purged between tests?

+0

Forcer également le sondage peut aider - http://stackoverflow.com/questions/11766511/tests- do-not-run-when-fichier-change-with-guard-et-rspec-on-windows – Nick

Questions connexes