【问题标题】:Passes validation even though column is nil Rspec即使列为 nil Rspec 也通过验证
【发布时间】:2020-07-25 04:11:35
【问题描述】:

Rspec

it "should lastname" do
        valid_params[:lastname]     = nil
        user                        = User.new(valid_params)

        expect(user).to_not be_valid
end

it "should have username" do
        valid_params[:username]     = nil
        user                        = User.new(valid_params)

        expect(user).to_not be_valid
end

迁移文件

create_table :users do |t|
      ## Database authenticatable
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""
      t.string :firstname,          null: false, default: ""
      t.string :lastname,           null: false, default: ""
      t.string :username,           null: false, default: ""
      t.boolean :admin,             default: false

型号 除了设计验证,我没有任何验证

class User < ApplicationRecord
    after_initialize :set_initial_password
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
  :recoverable, :rememberable, :validatable

  private
  def set_initial_password
    if !self.firstname.nil? && !self.lastname.nil?
        self.password = self.firstname.downcase + self.lastname.downcase
    end
  end
end

错误

  1) User should have username
     Failure/Error: expect(user).to_not be_valid
       expected #<User id: nil, email: "wynell_daniel@schiller.co", firstname: "Garfield", lastname: "Koepp", username: nil, admin: false, created_at: nil, updated_at: nil> not to be valid

Rspec 测试确实通过了姓氏,但没有通过用户名,即使它们具有相同的条件。

【问题讨论】:

  • 可能是因为您没有验证。请发布您的型号代码
  • @jamesc 我没有任何验证,但如果是这样,那么姓氏也不会通过?
  • 您需要验证不应该为 nil 的字段的存在调用。你没有显示你的测试失败结果,所以我不知道失败的原因
  • 我已经给了你一个答案,希望能得到一个解释,让你更清楚。您应该查看模型返回的验证错误以查看更多信息

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


【解决方案1】:

要使验证首先失败,您必须进行验证,因此您的模型需要以下内容

validates :username, presence: true

模型不会针对数据库进行验证。他们将根据模型中的验证方法进行验证。如果没有验证,您的模型将是有效的,但如果您在数据库中没有 null 限制,数据库将拒绝它

更新对 cme​​ts 的回应

您认为正在发生的事情并不是实际发生的事情。 lastname 测试通过的原因只有一个,那就是用户对象无效。由于您尚未发布完整的测试,因此您可以确定在这种情况下用户对象未通过验证的原因。

要找出错误是什么,您应该检查对象错误。尝试以下代码(未经测试但应该可以正常工作)并查看控制台输出以获取无效属性列表

it "should lastname" do
        valid_params[:lastname]     = nil
        user                        = User.new(valid_params)
        user.errors.each do |error|
          puts("Err: #{error.inspect}")
        end 
        expect(user).to_not be_valid
end

然后你就会明白到底是什么失败了。如果姓氏实际上失败了,您将看到原因为空白或姓氏无效。如果 lastname 没有出现在输出中,那么它不是错误的。 如果您在错误列表中看到姓氏,那么devise 中的姓氏会得到验证。我对devise 一点也不熟悉,因为我总是使用自己的身份验证逻辑,所以这可能与您所包含的选项之一有关。

我不能说得足够清楚。如果没有验证码,那么模型实例不可能是无效的。

【讨论】:

  • 我知道它应该首先进行验证才能使其测试失败,但我已经多次尝试过这种方法,但它不仅适用于这种情况。请您解释为什么“姓氏”验证失败而“用户名”即使条件相同也没有失败?
猜你喜欢
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
相关资源
最近更新 更多