私は Authlogic と Rails 3.2.3 を使用しています。Authlogic は開発モードでユーザーを正しく検証し、登録後にアクティブなユーザーでログインできますが、テスト モードで Capybara との統合テストを実行するとpassword is not valid
エラーが発生します。
パスワードが同じでアクティブであることを確認し、設定も試みました
acts_as_authentic do |c|
c.validate_password_field = false
end
私のテストではファクトリーを使用しています。これが私のファクトリー定義です。
FactoryGirl.define do
factory :user do
sequence :email do |i|
"test_user_#{i}@example.com"
end
sequence :name do
|i| "test user#{i}"
end
password "testtesttest"
password_confirmation "testtesttest"
password_salt "passwordsalt"
perishable_token "windowintheskies"
single_access_token "123123123"
end
end
私のデータベース フィールドはすべて、Varchar(255) である crypted_password フィールドを許可します。
+---------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| crypted_password | varchar(255) | NO | | NULL | |
| password_salt | varchar(255) | NO | | NULL | |
| email | varchar(255) | NO | | NULL | |
| persistence_token | varchar(255) | NO | | NULL | |
| single_access_token | varchar(255) | NO | | NULL | |
| perishable_token | varchar(255) | NO | | NULL | |
| login_count | int(11) | NO | | 0 | |
| failed_login_count | int(11) | NO | | 0 | |
| last_request_at | datetime | YES | | NULL | |
| current_login_at | datetime | YES | | NULL | |
| last_login_at | datetime | YES | | NULL | |
| current_login_ip | varchar(255) | YES | | NULL | |
| last_login_ip | varchar(255) | YES | | NULL | |
| name | varchar(255) | NO | | | |
| created_at | datetime | NO | | NULL | |
| updated_at | datetime | NO | | NULL | |
| active | tinyint(1) | YES | | 0 | |
+---------------------+--------------+------+-----+---------+----------------+
カピバラを使用して統合テストを実行していますが、開発モードではなくテストモードでのみエラーが発生することがわかりました。
また、パスワードが空白ではないことを確信しています
私の統合テスト仕様は次のようになります
require 'spec_helper'
describe "/lists" do
before(:each) do
@user = FactoryGirl.build(:user, :password => 'testtesttest', :password_confirmation => 'testtesttest')
@user.activate!
end
it "loads the list creation pages on clicking the new list button" do
visit new_user_session_path
fill_in "user_session_email", :with => @user.email
fill_in "user_session_password", :with => 'testtesttest'
click_button "Login"
page.should have_content "My Lists"
visit lists_path
click_link "Create A New List"
page.should have_content('New List')
end
私の user_sessions_controller は次のようになります
def create
@user_session = UserSession.new(params[:user_session])
puts "*" * 50
puts " Password - #{params[:user_session][:password].to_s}"
puts " User #{User.where(:email => params[:user_session][:email]).first.inspect}"
puts "Valid #{User.where(:email => params[:user_session][:email]).first.valid_password?(params[:user_session][:password])}"
puts " Active = #{User.where(:email => params[:user_session][:email]).first.active?}"
puts "*" * 50
if @user_session.save!
flash[:notice] = "Login successful!"
redirect_back_or_default lists_url
else
puts "Error : #{@user_session.errors.inspect}"
render :action => :new
end
end