Ruby on rails 这个长度验证在RubyonRails中是如何工作的?

Ruby on rails 这个长度验证在RubyonRails中是如何工作的?,ruby-on-rails,ruby,validation,Ruby On Rails,Ruby,Validation,我正在学习MichaelHartl的Rails教程。在中,我们正在为用户名和电子邮件创建长度验证测试 在test/models/user_test.rb文件中,他说要编写 test "name should not be too long" do @user.name = "a" * 51 assert_not @user.valid? end 然后在app/models/user.rb中 class User < ActiveRecord::Base validates :name

我正在学习MichaelHartl的Rails教程。在中,我们正在为用户名和电子邮件创建长度验证测试

在test/models/user_test.rb文件中,他说要编写

test "name should not be too long" do
@user.name = "a" * 51
assert_not @user.valid? 
end
然后在app/models/user.rb中

class User < ActiveRecord::Base 
validates :name,  presence: true, length: { maximum: 50 }
class用户
我的问题是,测试如何确保名称长度不超过60个字符?我知道验证表明最大长度为50,但测试表明,如果user.name等于51个字符…不大于或等于,则断言用户无效


老实说,我不明白为什么需要user.rb中的validates和测试文件之间的关系,所以这可能是我感到困惑的原因

测试只是断言一个包含51个字符的用户名不应该是有效的

测试无法“确保”用户名长度不能为60个字符。这就是实际验证代码所做的

例如,如果要将验证代码更改为:

class User < ActiveRecord::Base 
validates :name,  presence: true, length: { maximum: 60 }
class用户

然后测试将失败,因为代码正在验证一个包含51个字符的用户名。

在测试中,您需要确保您的代码按预期执行所有操作。在这种情况下,您无法使用长度超过50个符号的
name
保存用户。这就是为什么在测试中,您要检查用户是否在
name
length==51符号时变为无效

但您也正确地认识到,此测试不能保证名称长度为60的用户也将无效。它也不会检查50是否为最大值,因为它将被忽略

validates :name,  presence: true, length: { maximum: 1 }
比如说。但你可能不希望你的应用程序表现得像这样。这就是为什么我还鼓励您添加另一项检查,以确定最大允许长度:

@user.name = "a" * 50
assert @user.valid?
通常,如果您怀疑代码中可能存在错误,您可以自由添加新的测试。但是在本例中,您不应该实际测试代码的行为,因为存在/长度验证在Rails本身中已经过很好的测试。您应该检查是否在模型中包含了这样的验证,并传递了正确的参数。例如,在中,您有以下助手:

should validate_presence_of(:name)
should validate_length_of(:name).is_at_most(50)
我不确定单元测试是否有类似的功能,很可能没有,所以您应该用自己的方式进行测试,并假设这已经足够了