Railsテストを実行しているときに、RSpecで少し問題が発生しています。テストは次のとおりです。
it "allows a user to request a password reset" do
user = FactoryGirl.create(:user, :name => "John Smith", :email => "john@test.org")
identity = Identity.create!(email: user.email, password: "please", password_confirmation: "please")
visit "/"
click_on "Forgotten password?"
fill_in "email", :with => "john@test.org"
click_on "Reset Password"
ActionMailer::Base.deliveries.last.to.should include(user.email)
ActionMailer::Base.deliveries.last.body.should include(identity.password_reset_token)
visit '/password_resets/' + identity.password_reset_token.to_s + '/edit'
^ **** ERROR HERE : password_reset_token is nil! ****
fill_in "identity_password", :with => "newpass123"
fill_in "identity_password_confirmation", :with => "newpass123"
click_on "Update Password"
within page.all('div#loginModal')[0] do
fill_in "auth_key", :with => "john@test.org"
fill_in "password", :with => "newpass123"
click_button "Log in"
end
page.should have_content("Hi John")
end
返されるエラーの概要を説明したことがわかります。これは奇妙なことです。送信された電子メールを調べると、実際にはpassword_reset_tokenが生成されるためです。
参考までに、これを行うために使用するコードは次のとおりです。
class PasswordResetsController < ApplicationController
def create
identity = Identity.find_by_email(params[:email])
identity.send_password_reset if identity
redirect_to root_url, :notice => "Email sent with password reset instructions."
end
def edit
@identity = Identity.find_by_password_reset_token!(params[:id])
end
def update
@identity = Identity.find_by_password_reset_token!(params[:id])
if @identity.password_reset_sent_at < 2.hours.ago
redirect_to new_password_reset_path, :alert => "Password reset has expired."
elsif @identity.update_attributes(params[:identity])
redirect_to root_url, :notice => "Password has been reset."
else
render :edit
end
end
end
と...
class Identity < OmniAuth::Identity::Models::ActiveRecord
attr_accessible :email, :password, :password_confirmation
validates_uniqueness_of :email
validates_format_of :email, :with => /^[-a-z0-9_+\.]+\@([-a-z0-9]+\.)+[a-z0-9]{2,4}$/i
def send_password_reset
generate_token(:password_reset_token)
self.password_reset_sent_at = Time.zone.now
self.save!
UserMailer.password_reset(self).deliver
end
private
def generate_token(column)
begin
self[column] = SecureRandom.urlsafe_base64
end while Identity.exists?(column => self[column])
end
end
なぜこれが起こっているのか誰かが提案できますか?テスト環境のどこかにデータベースレコードが保存/アクセスまたはキャッシュされていないことと関係がありますか?
助けていただければ幸いです。