0

有効なパスワードのテストに合格しようとしています。実行するとpassword_digestハッシュが違うようです。それらを一致させるために何をすべきかわかりません。

私は主に、Michael Hartl による「Ruby on Rails Tutorial: Learn Rails by Example」という本を使用していましたが、彼はこれに合格したようです。

さらに、私のアプリケーション コードは期待どおりに動作します。ユーザーを作成してコンソールで認証できるので、これはテストの中断にすぎません。

私はテストにかなり慣れていないので、ここで明らかな何かが欠けている可能性があります。

ご協力いただきありがとうございます!

私はbcryptを使用してhas_secure_passwordいますが、これは関連するユーザー仕様コードの一部です:

describe User do

  before { @user = User.new(name: "Example User", email: "user@example.com", password: "foobar", password_confirmation: "foobar") }

  subject { @user }

  it { should respond_to(:name) }
  it { should respond_to(:email) }
  it { should respond_to(:password_digest) }
  it { should respond_to(:password) }
  it { should respond_to(:password_confirmation) }
  it { should respond_to(:authenticate) }

  it { should be_valid }

  describe "return value of authenticate method" do
    before { @user.save }
    let(:found_user) { User.find_by(email: @user.email) }

    describe "with a valid password" do
      it { should eq found_user.authenticate(@user.password) }
    end

    describe "with an invalid password" do
      let(:user_for_invalid_password) { found_user.authenticate('invalid') }

      it { should_not eq user_for_invalid_password }
      specify { expect(user_for_invalid_password).to be_false }
    end
  end
end

そして、これは私のユーザーモデルです

class User < ActiveRecord::Base
  before_save  { self.email = email.downcase }

  validates :name, presence: true, length: { maximum: 50 }

  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i
  validates :email, presence: true, uniqueness: { case_sensitive: false }, format: { with: VALID_EMAIL_REGEX }

  has_secure_password
  validates :password_confirmation, presence: true
  validates :password, length: { minimum: 6 }
end
4

1 に答える 1

2

問題はあなたにありますbefore { @user.save }。気付いていないかもしれませんが、beforeデフォルトはbefore(:each)です。これは、このコードがグループ内の各例の前に実行されることを意味します。おそらくbefore(:all)、グループ内のすべての例の前に、1 回だけ実行される既定値になると予想していました。

おっしゃったように、各テストの後にデータベースをクリアしていません。したがって、各テストの前に、 を呼び出し@user.saveます。false同じ電子メール アドレスで別のユーザーを作成しようとしているため、これは を返すことにより、暗黙のうちに検証に失敗します。#save!検証例外がスローされるように使用することをお勧めします。これにより、このような問題がより明確になります。

要約する:

于 2013-05-19T02:01:35.647 に答える