2010-11-27 6 views
6

Ich möchte einen Schienenintegrationstest schreiben (mit ActionDispatch::IntegrationTest). Ich benutze Gerät für Authentifizierung und Maschinist für Testmodelle. Ich kann nicht erfolgreich anmeldenRails Integrationstest mit dem Gerät Edelstein

Hier ist ein einfaches Beispiel:.

class UserFlowsTest < ActionDispatch::IntegrationTest 
    setup do 
    User.make 
    end 
    test "sign in to the site" 
    # sign in 
    post_via_redirect 'users/sign_in', :email => '[email protected]', :password => 'qwerty'  
    p flash 
    p User.all 
end 

Hier ist die Debug-Ausgabe:

Loaded suite test/integration/user_flows_test 
Started 
{:alert=>"Invalid email or password."} 
[#<User id: 980190962, email: "", encrypted_password: "", password_salt: "", reset_password_token: nil, remember_token: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, created_at: "2010-11-27 16:44:10", updated_at: "2010-11-27 16:44:10">, #<User id: 980190963, email: "[email protected]", encrypted_password: "$2a$10$vYSpjIfAd.Irl6eFvhJL0uAwp4qniv5gVl4O.Hnw/BUR...", password_salt: "$2a$10$vYSpjIfAd.Irl6eFvhJL0u", reset_password_token: nil, remember_token: nil, remember_created_at: nil, sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil, created_at: "2010-11-27 17:09:13", updated_at: "2010-11-27 17:09:13">] 
"/unauthenticated" 
F 

Hier ist meine blueprints.rb:

require 'machinist/active_record' 
require 'sham' 

User.blueprint do 
    email {"[email protected]"} 
    password {"qwerty"} 
end 
+0

Ich begann vor kurzem mit dem Lesen von Rails Test Prescriptions (http://pragprog.com/titles/nrtest/rails-test-prescriptions). Ziemlich früh im Buch erwähnt Noel, dass er Devise zur Authentifizierung verwenden wird. Ich bin zu github.com gesprungen, um mir seine Beispielanwendung (https://github.com/noelrappin/huddle) anzusehen, um zu sehen, ob er dieses Problem löst. Obwohl er keine Integrationstests enthält, poste ich es hier als Referenz. – hiwaylon

+0

Ich habe auch (zurück) auf AuthLogic (https://github.com/binarylogic/authlogic) für die Authentifizierung in meiner Anwendung umgeschaltet. Ich habe es schon früher benutzt und mag es viel besser als Devise. – hiwaylon

Antwort

2

Ich habe keinen Musterintegrationstest im Buch für Devise, aber ich denke der Code in der Schrittdefinition im Cucumbe r Kapitel wird auch funktionieren, wenn Sie webrat/Capybara installiert haben:

@user = User.create!(:email => "[email protected]", 
      :password => "password", 
      :password_confirmation => "password") 
visit "login" 
fill_in("user_email", :with => @user.email) 
fill_in("user_password", :with => "password") 
click_button("Sign In") 
+0

Danke für die Antwort. Ich muss das Projekt wieder ausgraben und sehen, wie das funktioniert. +1 für jetzt.Danke auch für das Gute :) – hiwaylon

8

Zunächst einmal mit devise, müssen Sie unter Umständen „bestätigen“ den Benutzer.

Sie können etwas tun:

user = User.make! 
user.confirmed_at = Time.now 
user.save! 

Hier ist ein Beispiel ohne Maschinist (aber Sie haben nur die Benutzererstellung Codeabschnitt mit dem Teil oben ersetzen):

in test_integration_helper:

require "test_helper" 
require "capybara/rails" 

    module ActionController 
     class IntegrationTest 
     include Capybara 

     def sign_in_as(user, password) 
      user = User.create(:password => password, :password_confirmation => password, :email => user) 
      user.confirmed_at = Time.now 
      user.save! 
      visit '/' 
      click_link_or_button('Log in') 
      fill_in 'Email', :with => user.email 
      fill_in 'Password', :with => password 
      click_link_or_button('Sign in') 
      user  
     end 
     def sign_out 
      click_link_or_button('Log Out') 
     end 
     end 
    end 

Und in Ihr integration_test:

require 'test_integration_helper' 

class UsersIntegrationTest < ActionController::IntegrationTest 

    test "sign in and then sign out" do 
    #this helper method is into the test_integration_helper file     
    sign_in_as("[email protected]", "monkey")   
    assert page.has_content?('Signed in successfully'), "Signed in successfully" 

    sign_out   
    assert page.has_content?('Signed out successfully'), "Signed out successfully" 
    end 
end 
+0

Danke für die Antwort. Ich muss das Projekt wieder ausgraben und sehen, wie das funktioniert. +1 für jetzt. – hiwaylon

1

Falls jemand ein ähnliches Problem hat ...

Ich war in einer ähnlichen Situation (von Authlogic Migration) und hatte genau dieses gleiche Problem. Das Problem lag im Initiator devise.rb. Standardmäßig richtet es Ihre Testumgebung so ein, dass nur eine Strecke während der Verschlüsselung/Entschlüsselung von Passwörtern verwendet wird. Ich weiß ehrlich gesagt nicht, was für eine Strecke, aber für Devise, um mit alten verschlüsselten Passwörtern zu arbeiten, müssen die Strecken 20 sein. Da ich versuchte, einen Benutzer zu registrieren, der ursprünglich sein Passwort von Authlogic in meinem Test verschlüsselt hatte, Devise muss im Test auch 20 Dehnungen verwenden. Ich änderte die Config wie folgt:

# Limiting the stretches to just one in testing will increase the performance of 
# your test suite dramatically. However, it is STRONGLY RECOMMENDED to not use 
# a value less than 10 in other environments. 
- config.stretches = Rails.env.test? ? 1 : 20 
+ config.stretches = 20 
10

Der Grund ist es nicht funktioniert, ist devise Form Feldnamen als

'user[email]' 
'user[password]' 

erstellt und post_via_redirect erwartet diese Namen als Argumente. Die folgende Anweisung würde zu einer erfolgreichen Anmeldung führen.

post_via_redirect 'users/sign_in', 'user[email]' => '[email protected]', 'user[password]' => 'qwerty' 
+0

Nur für den Fall, dass es hilft - in meinem Fall, weil es ein Integrationstest von JSON war nur 'post_via_redirect 'Benutzer/sign_in', Benutzer: {email:" [email protected] ", Passwort:" qwerty "}, Format:: Json arbeitete. – kangkyu