代码之家  ›  专栏  ›  技术社区  ›  Merey Nurlan

即使列为nil Rspec,也通过验证

  •  0
  • Merey Nurlan  · 技术社区  · 4 年前

    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
    

    模型 除了Devise验证之外,我没有任何验证

    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测试确实通过姓氏,但不通过用户名,尽管它们具有相同的条件。

    0 回复  |  直到 4 年前
        1
  •  3
  •   jamesc    4 年前

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

    validates :username, presence: true
    

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

    更新 对评论的回应

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

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

    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
    

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

    我说得再清楚不过了。如果没有验证代码,则模型实例不可能无效。