0

我正在尝试编写一个测试来验证电子邮件地址的唯一性。

这是为了在 Rails 4.0.0 中创建一个新的用户帐户并使用 has_secure_password。

我收到此错误:

User should require case sensitive unique value for email
     Failure/Error: it { should validate_uniqueness_of(:email) }
     RuntimeError:
       Password digest missing on new record
     # ./spec/models/user_spec.rb:8:in `block (2 levels) in <top (required)>'

user_spec.rb

require "spec_helper"

describe User do
  it { should validate_presence_of(:email) }
  it { should validate_presence_of(:full_name) }
  it { should validate_presence_of(:password_digest) }
  it { should validate_uniqueness_of(:email) }
end

这是用户模型:

class User < ActiveRecord::Base
  has_secure_password

  validates :email, presence: true, uniqueness: true
  validates :full_name, presence: true
  validates :password_digest, presence: true
end

错误消息是什么意思,我做错了什么?

4

2 回答 2

1

问题解决了。我在每次测试之前添加了一行来创建一个用户对象,现在错误消失了。

describe User do        
  # this before section solved the problem
  before(:each) do
    User.create(
      full_name: "Bob",
      email: "bob@bob.com",
      password: "bob",
      password_confirmation: "bob"
    )
  end

  it { should validate_presence_of(:email) }
  it { should validate_presence_of(:full_name) }
  it { should validate_presence_of(:password_digest) }

  it { should validate_uniqueness_of(:email) }
end
于 2013-09-09T05:51:47.797 回答
0

您的问题的答案在这里:https ://github.com/thoughtbot/should-matchers/issues/371

似乎当前的解决方案是在测试唯一性之前创建一个新记录。简而言之,这是根本问题:

看来Rails 4 版本has_secure_password增加了一个before_create 来保证password_digest填写;然而,Rails 3 版本没有这个检查。

于 2013-10-21T15:28:14.460 回答