Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 即使列为nil Rspec,也通过验证_Ruby On Rails_Rspec_Rspec Rails - Fatal编程技术网

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

Ruby on rails 即使列为nil Rspec,也通过验证,ruby-on-rails,rspec,rspec-rails,Ruby On Rails,Rspec,Rspec Rails,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

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用户
错误

1)用户应具有用户名
失败/错误:预期(用户)。无效
应为无效

Rspec测试对lastname通过,但对username不通过,即使它们具有相同的条件。

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

  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
模型不会根据数据库进行验证。他们将根据模型中的验证方法进行验证。如果没有验证,您的模型将是有效的,但如果数据库中没有空限制,则数据库将拒绝该模型

更新对评论的回应

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

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

validates :username, presence: true
然后你就会明白到底是什么失败了。如果lastname实际失败,您将看到原因为空或lastname无效。如果lastname没有出现在输出中,则它没有错误。 如果您在错误列表中看到lastname,则在
designe
中对lastname进行验证。我对
design
一点也不熟悉,因为我总是使用自己的身份验证逻辑,所以这可能与您包含的其中一个选项有关


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

可能是因为没有验证。发布您的模型代码please@jamesc我没有任何验证,但如果是这种情况,那么lastname也不会通过?您需要验证不应为nil的字段的状态调用。你没有展示你的测试失败结果,所以我不知道失败的原因。我已经给了你一个答案,希望有一个解释能让你更清楚。您应该查看模型返回的验证错误以查看更多信息我理解这样一个事实,即它应该首先进行验证,以使其无法通过测试,但我已经多次尝试了这种方法,并且它不仅适用于这种情况。请解释为什么“lastname”验证失败,“username”即使条件相同也不会失败?
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