2013-03-29 2 views
2

J'ai actuellement cette méthode dans ma classe User:Comment créer un test rspec pour un self.method?

def self.authenticate(email, password) 
    user = User.find_by_email(email) 
    (user && user.has_password?(password)) ? user : nil 
end 

Comment puis-je exécuter des tests rspec à ce sujet?

J'ai essayé de lancer it { responds_to(:authenticate) }, mais je suppose que l'auto-chose est différente de l'authentification. Je suis toujours un débutant aux rails et tous les conseils sur la façon de tester et d'explication sur le mot-clé self seront très appréciés!

Répondre

3
describe User do 
    let(:user) { User.create(:email => "[email protected]", :password => "foo") } 

    it "authenticates existing user" do 
    User.authenticate(user.email, user.password).should eq(user) 
    end 

    it "does not authenticate user with wrong password" do 
    User.authenticate(user.email, "bar").should be_nil 
    end 
end 
1

@ réponse de DEPA est bon, mais pour le bien des alternatives et parce que je préfère la syntaxe plus courte:

describe User do 
    let(:user) { User.create(:email => email, :password => password) } 

    describe "Authentication" do 
    subject { User.authenticate(user.email, user.password) } 

    context "Given an existing user" do 
     let(:email) { "[email protected]" } 
     context "With a correct password" do 
     let(:password) { "foo" } 
     it { should eq(user) } 
     end 
     context "With an incorrect password" do 
     let(:password) { "bar" } 
     it { should be_nil } 
     end 
    end 
    end 
end 

En dehors de ma préférence pour le sytax, je crois que cela a 2 avantages majeurs sur l'autre style:

  • il facilite de passer outre certaines valeurs (comme je l'ai fait avec password ci-dessus)
  • Plus important encore, il met en évidence ce que n'a pas été testé, par ex. un mot de passe vide, un utilisateur qui n'existe pas, etc.

Voilà pourquoi la combinaison de l'utilisation context et subject et let est, pour moi, de loin supérieur au style habituel.