2013-07-25 6 views
0

Je commence tout juste à apprendre les tests avec rspec dans Rails. J'ai un modèle utilisateur et je suis en train d'écrire un test pour signer l'utilisateur dans les ouvrages suivants:.sign_in test utilisateur rspec

describe "user login" do 
    let(:user) { FactoryGirl.create(:user) } 

    it "logs user in" do 
    visit root_path 
    click_link "Log In" 
    fill_in "Email", with: user.email 
    fill_in "Password", with: user.password 
    click_button "Submit" 

    expect(page).to have_content("You are now logged in.") 
    end 
end 

Dans mon application_controller.rb je la méthode suivante:

def sign_in(user) 
    cookies.permanent[:auth_token] = user.auth_token 
    current_user = user 
end 

helper_method: sign_in 

Et je me demande pourquoi ma méthode sign_in ne fonctionne pas dans le test suivant:

describe "user login2" do 
    let(:user) { FactoryGirl.create(:user) } 

    it "logs user in" do 
    sign_in(user) 

    expect(page).to have_content("You are now logged in.") 
    end 
end 

je reçois l'erreur suivante: Failure/Error: sign_in(user) NoMethodError: undefined method 'sign_in'

Répondre

0

L'idée derrière les tests d'intégration est que vous interagissez avec l'interface de la même manière qu'un utilisateur normal. C'est ce que vous faites dans le premier test utilisant Capybara. Dans le deuxième test, vous devrez probablement inclure le code du contrôleur avant de pouvoir appeler la méthode d'assistance. Mais le test ne fonctionnera toujours pas, car vous essayez de tester si quelque chose est présenté sur la page, bien que vous n'ayez pas encore appelé la visite.

Si vous voulez écrire des tests d'intégration, vous devriez aller avec le premier test.

Si vous souhaitez écrire d'autres tests de niveau inférieur, vous pouvez vous connecter à l'utilisateur directement à partir du contrôleur, mais vous devez ensuite le valider d'une manière différente. Soit à travers certains attributs du contrôleur/modèle ou directement à partir de la base de données.