这个长度验证如何在Ruby on Rails中运行?

时间:2014-12-27 05:11:42

标签: ruby-on-rails ruby validation

我正在关注Michael Hartl的Rails教程。在chapter 6中,我们正在为用户名和电子邮件创建长度验证测试。

在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 }

我的问题是,测试如何确保名称不是,例如,60个字符长?我得到验证说最大长度为50,但是如果user.name EQUALS 51个字符...不大于或等于,则测试表明用户无效。

说实话,我不理解你在user.rb中需要验证的原因与测试文件之间的关系,这可能就是为什么我感到困惑。

2 个答案:

答案 0 :(得分:2)

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

但是你也是正确的,这个测试并不能保证名字长度为60的用户也是无效的。它也没有检查50是否是最大值,因为它将通过

validates :name,  presence: true, length: { maximum: 1 }
例如,

。但是你可能不希望你的应用程序像这样。这就是为什么我还鼓励你为最大允许长度添加另一张支票:

@user.name = "a" * 50
assert @user.valid?

通常,如果您怀疑代码中存在某些错误,您可以自由添加新测试。但在这种情况下,您不应该实际测试代码的行为方式,因为存在/长度验证在Rails本身中经过了充分测试。您应该检查是否在模型中包含了这些验证,并且传递了正确的参数。例如,在shoulda-matchers中你有这些助手:

should validate_presence_of(:name)
should validate_length_of(:name).is_at_most(50)

我不确定单元测试是否有类似物,很可能不是,所以你应该按照这样做的方式自己测试并假设这已经足够了。

答案 1 :(得分:1)

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

测试没有确保&#39;用户名不能超过60个字符。这就是实际验证代码的作用。

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

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

然后测试会失败,因为代码 验证了51个字符的用户名。