特徴
ユーザーにはプロファイルがあり、それを更新できる必要があります。
問題
プロファイルを更新します。たとえば、名前を「ホーマー シンプソン」に変更しますが、データベース レコードが更新されていないように見えるため、すべてのアサーションが失敗します。
更新された属性を取得できないようです:
Failure/Error: expect(subject.current_user.first_name).to eq('Homer')
expected: "Homer"
got: "Lew"
(compared using ==)
# ./spec/controllers/registrations_controller_spec.rb:67:in `block (3 levels) in <top (required)>'
NB私は両方を試しまし@user.reload
たsubject.current_user.reload
仕様はまだ合格していません。
コード
私は使っている:
- レール (4.0.0)
- 考案 (3.0.3)
- rspec レール (2.14.0)
- カピバラ (2.1.0)
- factory_girl (4.2.0)
- データベースクリーナー (1.1.1)
私はすでにチェックしました:
devise.mapping
ユーザーに設定しました- この他の Stackoverflow スレッド に従って
valid_session
、デバイス セッションを汚染することはありません。
registrations_controller_spec.rb
describe "User Profiles" do
login_user
it "Update - changes the user's attributes" do
put :update, id: @user, user: attributes_for(:user, first_name: 'Homer')
@user.reload
expect(@user.first_name).to eq('Homer') # FAILS
end
end
私はこのStackoverflowスレッド@user
のように交換しようとしました: 「Eメールアドレスを確認しようとしているかのように更新時にRspec登録コントローラーテストが失敗する」subject.current_user
put :update, id: subject.current_user, user: attributes_for(:user, first_name: 'Homer')
subject.current_user.reload
expect(subject.current_user.first_name).to eq('Homer') # Still FAILS
しかし、それでも失敗します。
コントローラーに問題があるのでしょうか? current_user.id
via ではなくby でユーザーを見つけますparams[:id]
。
registrations_controller.rb
def update
@user = User.find(current_user.id)
email_changed = @user.email != params[:user][:email]
password_changed = !params[:user][:password].blank?
if email_changed or password_changed
successfully_updated = @user.update_with_password(user_params)
else
successfully_updated = @user.update_without_password(user_params)
end
if successfully_updated
sign_in @user, bypass: true # Sign in the user bypassing validation in case his password changed
redirect_to user_profile_path, notice: 'Profile was successfully updated.'
else
render "edit"
end
end
controller_macros.rblogin_user
-ヘルパーを定義します
module ControllerMacros
def login_user
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:user]
@user = FactoryGirl.create(:user)
@user.confirm!
sign_in @user
end
end
end
私の統合仕様は問題なく通過します。ここでコントローラーに何が欠けていますか?