Ruby on rails RubyonRails应出现测试错误:新记录中缺少密码摘要

Ruby on rails RubyonRails应出现测试错误:新记录中缺少密码摘要,ruby-on-rails,rspec,rspec-rails,shoulda,Ruby On Rails,Rspec,Rspec Rails,Shoulda,我正在尝试编写一个测试来验证电子邮件地址的唯一性 这是为了在Rails 4.0.0中创建一个新的用户帐户,并使用has_secure_密码 我得到了这个错误: User should require case sensitive unique value for email Failure/Error: it { should validate_uniqueness_of(:email) } RuntimeError: Password digest missi

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

这是为了在Rails 4.0.0中创建一个新的用户帐户,并使用has_secure_密码

我得到了这个错误:

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)>'
以下是用户模型:

class User < ActiveRecord::Base
  has_secure_password

  validates :email, presence: true, uniqueness: true
  validates :full_name, presence: true
  validates :password_digest, presence: true
end
class用户

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

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

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

你的问题的答案如下:

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

Rails 4版本的
似乎有\u secure\u密码
添加了 在创建之前,确保已填写
密码摘要
;然而, Rails 3版本没有此检查


如果您提供不同的电子邮件,是否仍会抛出错误?我所做的是运行
bundle exec rspec
,而不提供电子邮件地址。在中,似乎没有输入电子邮件地址的要求。我甚至不知道在哪里输入电子邮件地址!如何在规范中生成
User
对象?你能发布你的工厂/设备代码吗?现在我没有生成用户,这可能是问题的一部分!(60秒后…)拉杰什,你是个天才!我添加了
User.create(全名:“Bob”,电子邮件:bob@bob.com,密码:“bob”,密码\u确认:“bob”)
在每次测试之前运行,解决了问题。请接受我的感谢和投票。同意它解决了问题。但是,为所有测试创建用户是不好的!只有唯一性验证需要数据库中已有的记录(或者它尝试使用选项
:validate=>false
)创建新记录)。这就是你出错的原因。来源:Good point gotva。我将
user\u spec.rb
更新为仅执行
user.create(…)
上的
应验证(:email)
的唯一性。谢谢你的提示。
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