bcrypt-ruby
と を使用してユーザー認証を行う基本的なアプリケーションをまとめましたhas_secure_password
。結果は、基本的にRails Tutorialのアプリケーションのベアボーン バージョンです。つまり、RESTful ユーザー モデルと、サインインおよびサインアウト機能を備えています。
ユーザー情報を編集するためのテストの一環として、パスワードを変更するためのテストを作成しました。パスワードの変更はブラウザで問題なく機能しますが、以下のテストはパスしません。
subject { page }
describe "successful password change"
let(:new_password) { "foobaz" }
before do
fill_in "Password", with: new_password
fill_in "Password Confirmation", with: new_password
click_button "Save changes"
end
specify { user.reload.password.should == new_password }
end
明らかに、ここでいくつかの基本的な詳細を誤解しています。
要するに:
1) 上記のコードが機能しないのはなぜですか? パスワードの変更機能はブラウザで機能します。その間、rspec
上記の最後の行で古いパスワードを再読み込みし続けます。そして、テストは失敗します。
2) パスワードの変更をテストするより良い方法は何ですか?
編集:
初期パスワードを に設定するfoobar
と、エラー メッセージは次のようになります。
Failure/Error: specify { user.reload.password.should == new_password }
expected: "foobaz"
got: "foobar" (using ==)
基本的に、before
ブロックは実際には新しいパスワードを保存していないようです。
参考までに、関連するコントローラー アクションは次のとおりです。
def update
@user = User.find(params[:id])
if @user.update_attributes(params[:user])
flash[:success] = "Profile Updated"
sign_in @user
redirect_to root_path
else
render 'edit'
end
end