即使列为零也通过验证 Rspec
Passes validation even though column is nil Rspec
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 姓氏测试确实通过了,但用户名测试通过了,尽管它们具有相同的条件。
要使验证首先失败,您必须进行验证,以便您的模型需要以下内容
validates :username, presence: true
模型不针对数据库进行验证。他们将根据模型中的验证方法进行验证。如果没有验证,您的模型将是有效的,但如果您在 DB
中没有空限制,数据库将拒绝它
更新 回复评论
你认为正在发生的事情并不是实际发生的事情。
姓氏测试通过的原因只有一个,那就是用户对象无效。由于您尚未发布完整测试,因此您只能确定用户对象在这种情况下验证失败的原因。
要找出错误是什么,您应该检查对象错误。尝试以下代码(未经测试但应该可以正常工作)并查看控制台输出以获取无效属性列表
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
,因为我总是使用自己的身份验证逻辑,所以这可能与您提供的其中一个选项有关。
这个我说的还不够清楚。如果没有验证码,那么模型实例不可能是无效的。
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 姓氏测试确实通过了,但用户名测试通过了,尽管它们具有相同的条件。
要使验证首先失败,您必须进行验证,以便您的模型需要以下内容
validates :username, presence: true
模型不针对数据库进行验证。他们将根据模型中的验证方法进行验证。如果没有验证,您的模型将是有效的,但如果您在 DB
中没有空限制,数据库将拒绝它更新 回复评论
你认为正在发生的事情并不是实际发生的事情。 姓氏测试通过的原因只有一个,那就是用户对象无效。由于您尚未发布完整测试,因此您只能确定用户对象在这种情况下验证失败的原因。
要找出错误是什么,您应该检查对象错误。尝试以下代码(未经测试但应该可以正常工作)并查看控制台输出以获取无效属性列表
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
,因为我总是使用自己的身份验证逻辑,所以这可能与您提供的其中一个选项有关。
这个我说的还不够清楚。如果没有验证码,那么模型实例不可能是无效的。