【问题标题】:Ruby On Rails shoulda test error: Password digest missing on new recordRuby On Rails 应该测试错误:新记录中缺少密码摘要
【发布时间】:2013-09-09 02:20:11
【问题描述】:

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

这是为了在 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

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

【问题讨论】:

  • 如果您提供不同的电子邮件,是否仍然会抛出错误?
  • 我正在做的是运行bundle exec rspec 而不提供电子邮件地址。在docs for shoulda 中,似乎不需要输入电子邮件地址。我什至不确定在哪里输入电子邮件地址!
  • 如何在规范中生成User 对象?您可以为此发布您的工厂/夹具代码吗?
  • 此时我没有生成用户,这可能是问题的一部分! (60 秒后……) Rajesh,你真是个天才!我添加了User.create(full_name: "Bob", email: "bob@bob.com", password: "bob", password_confirmation: "bob") 在每次测试之前运行,这解决了问题。有我的感谢和支持。

标签: ruby-on-rails rspec rspec-rails shoulda


【解决方案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

【讨论】:

  • 同意它解决了问题。但是为所有测试创建用户并不好!只有唯一性验证需要数据库中存在的记录(或者它尝试使用选项:validate =&gt; false 创建新记录)。这就是你得到错误的原因。来源rubydoc.info/github/thoughtbot/shoulda-matchers/master/Shoulda/…
  • 好点了。我将user_spec.rb 更新为仅在should validate_uniqueness_of(:email) 上执行User.create(...)。感谢您的提示。
【解决方案2】:

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

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

Rails 4 版本的has_secure_password 似乎添加了一个 before_create 确保填写password_digest;然而, Rails 3 版本没有这个检查。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    • 2016-02-13
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多