1

~~~~~~~~~~~~~~~ 編集/更新 ~~~~~~~~~~~~~~~

OK、変更ブロックの各 user.password_digest に「.to_s」を追加することで、合格しなかったテストを修正しました。以前は user.password_digest がポインターのようなもので、「to_s」を呼び出すと、テストで文字列値を比較するように強制されたため、これが機能していると思います。テストが値ではなくポインターを比較する理由を誰かが説明できる場合は、教えてください。

.to_s 呼び出しを追加した後 (ユーザー属性が変更されると予想していたすべての場所に追加されました)、失敗 #3 がまだ発生しています (実際には新しい失敗ですが、失敗 #3 を引き起こす同じ問題が原因であると確信しています)。「正しいパスワードを持つ正しいユーザーがメールを変更する必要がある」というテストが、ブラウザーで正しく発生する変更アクションをキャッチしない理由はありますか?

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

ユーザーのプロファイルを更新するフォームの動作を検証しようとしています (メールやパスワードを変更します)。3 つのテストが失敗しましたが、その理由がわかりません。テストを実行したときのコンソール出力を見てください...

Failures:
  1) User Pages Edit page correct user updates password with incorrect password should not change password
     Failure/Error: expect { click_button "Save" }.not_to change{ user.password_digest }
       result should not have changed, but did change from "$2a$10$Xrg1SHSyDmK5Of9HrjgYAuzkJzKk7HeaVjj4ZT9Ldz2R9BNji3D2S" to "$2a$10$Xrg1SHSyDmK5Of9HrjgYAuzkJzKk7HeaVjj4ZT9Ldz2R9BNji3D2S"
     # ./spec/requests/user_pages_spec.rb:135:in `block (6 levels) in <top (required)>'

  2) User Pages Edit page correct user updates password with confirmation mismatch should not change password
     Failure/Error: expect { click_button "Save" }.not_to change{ user.password_digest }
       result should not have changed, but did change from "$2a$10$bm2viuIuNCRIEEWe/qYVAOVl0r0EW7Y/1CqalKUwgR.ht/wVtQ8Zi" to "$2a$10$bm2viuIuNCRIEEWe/qYVAOVl0r0EW7Y/1CqalKUwgR.ht/wVtQ8Zi"
     # ./spec/requests/user_pages_spec.rb:147:in `block (6 levels) in <top (required)>'

  3) User Pages Edit page correct user updates email with correct password should change email
     Failure/Error: expect { click_button "Save" }.to change{ user.email }.to(new_email)
       result should have been changed to "new_email@example.com", but is now "person_7@example.com"
     # ./spec/requests/user_pages_spec.rb:121:in `block (6 levels) in <top (required)>'

Finished in 2.99 seconds
8 examples, 3 failures

失敗 1 と 2 はパスするはずですよね?前と後の文字列が一致し、変更されないことが期待されます! ここで何が起こっているのでしょうか?

さらに、失敗 #3 が発生している理由がわかりません。

コードはブラウザで期待どおりに機能します。AJAX と何か関係があるのでしょうか? フォームがヒットしている更新アクションは、redirect_to を何も実行しません。フラッシュ通知を使用してページを再度レンダリングするだけです。私は Rails の初心者なので、明らかな何かが欠けている可能性があります。

フォーム:

<%= form_tag user_path(params[:id]), method: :put do %>

    <%= label_tag :email %>
    <%= text_field_tag :email, params[:email] || @user.email %>

    <%= label_tag :new_password %>
    <%= password_field_tag :new_password %>

    <%= label_tag :new_password_confirmation, "Confirm new password" %>
    <%= password_field_tag :new_password_confirmation %>

    <%= label_tag :password %>
    <%= password_field_tag :password %>

    <%= submit_tag "Save", class: "btn btn-primary pull-down" %>
<% end %>

テスト仕様 (明確にするために無関係なテストを削除):

require 'spec_helper'
describe "User Pages" do

  subject { page }

  describe "Edit page" do
    let(:user) { FactoryGirl.create(:user) }

    describe "correct user" do
      before do
        log_in user # helper method that logs the user in, a la Michael Hartl tutorial
        visit edit_user_path(user)
      end

      it { current_path.should == edit_user_path(user) }
      it { should have_selector('title', text: 'Edit') }
      it { should_not have_content('not authorized') }

      describe "updates email" do
        let(:new_email) { "new_email@example.com" }
        before { fill_in 'Email', with: new_email }

        describe "with incorrect password" do
          it "should not change email" do
            expect { click_button "Save" }.not_to change{ user.email }
          end
        end

        describe "with correct password" do
          before { fill_in 'Password', with: user.password }
          it "should change email" do
            expect { click_button "Save" }.to change{ user.email }.to(new_email)
          end
        end
      end

      describe "updates password" do

        describe "with incorrect password" do
          before do
            fill_in 'New password', with: 'newpassword'
            fill_in 'Confirm new password', with: 'newpassword'
          end

          it "should not change password" do
            expect { click_button "Save" }.not_to change{ user.password_digest }
          end
        end

        describe "with confirmation mismatch" do
          before do
            fill_in 'New password', with: 'newpassword'
            fill_in 'Confirm new password', with: 'password'
            fill_in 'Password', with: user.password
          end

          it "should not change password" do
            expect { click_button "Save" }.not_to change{ user.password_digest }
          end
        end

        describe "with correct password" do
          before do
            fill_in 'New password', with: 'newpassword'
            fill_in 'Confirm new password', with: 'newpassword'
            fill_in 'Password', with: user.password
          end

          it "should change password" do
            expect { click_button "Save" }.to change{ user.password_digest }
          end
        end
      end
    end
  end
end

関連する gem バージョン: Rails 3.2.9、Capybara 1.1.2、FactoryGirl 4.1.0

4

0 に答える 0