J'essaie d'écrire des tests d'intégration avec rspec, factory_girl & capybara. J'ai aussi du concombre installé, mais je ne l'utilise pas (à ma connaissance).Test des sessions dans Rails 3 avec Rspec & Capybara
Je veux fondamentalement préremplir la base de données avec mon utilisateur, puis aller à ma page d'accueil et essayer de se connecter. Il devrait rediriger vers user_path (@user). Cependant, les sessions ne semblent pas être persistantes dans mes tests/rspec/requests/integration.
Mes spécifications: /rspec/requests/users_spec.rb
require 'spec_helper'
describe "User flow" do
before(:each) do
@user = Factory(:user)
end
it "should login user" do
visit("/index")
fill_in :email, :with => @user.email
fill_in :password, :with => @user.password
click_button "Login"
assert current_path == user_path(@user)
end
end
Retours:
Failures:
1) User flow should login user
Failure/Error: assert current_path == user_path(@user)
<false> is not true.
# (eval):2:in `send'
# (eval):2:in `assert'
# ./spec/requests/users_spec.rb:16
, il réoriente lieu à mon please_login_path - ce qui devrait se produire si la connexion échoue pour une raison quelconque (ou si la session [: id_utilisateur] n'est pas définie).
Si j'essaie de mettre session.inspect, il échoue en tant qu'objet nil.
Si j'essaie de le faire dans les tests de contrôleur (/rspec/controllers/sessions_spec.rb), je peux accéder à la session sans problème, et je peux appeler session [: user_id]
Je ne sais pas si cela est lié, mais vous ne devriez pas pouvoir obtenir le mot de passe d'un utilisateur en tapant @ user.password. Ceci est une faille de sécurité dans votre application. Conservez-vous les mots de passe en utilisant du texte brut? –
Ce n'est pas lié, et ce n'est probablement pas une faille de sécurité. L'appel à #password renvoie uniquement un mot de passe car il est défini dans la variable d'instance par Factory. Il est probable qu'il utilise Devise ou quelque chose de similaire qui ne conserve pas l'attribut password de la base de données en texte clair, et donc il ne serait pas disponible si cette variable d'instance disparaissait. –