0

我试图让我的有效密码测试通过。当我运行它时,password_digest哈希值似乎不同。我不知道该怎么做才能让他们匹配。

我主要使用 Michael Hartl 的“Ruby on Rails 教程:通过示例学习 Rails”一书,看来他通过了。

此外,我的应用程序代码按预期工作。我可以创建一个用户并在控制台中对他们进行身份验证,所以这只是在测试中。

我对测试还很陌生,所以我可能在这里遗漏了一些明显的东西。

谢谢你的帮助!

我正在使用 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)在组中的所有示例之前默认为只运行一次。

正如您所提到的,您不会在每次测试后清除数据库。因此,在每次测试之前,您都在调用@user.save. 这会通过返回静默验证失败false,因为您正在尝试使用相同的电子邮件地址创建另一个用户。最好使用#save!这样会引发验证异常,从而使此类问题更加明显。

总结一下:

  • 明确使用before(:all)before(:each)
  • 使用#save!代替#save
  • 在每次测试之间清除数据库(试用Database Cleaner
于 2013-05-19T02:01:35.647 回答