【问题标题】:How does this length validation work in Ruby on Rails?这种长度验证在 Ruby on Rails 中是如何工作的?
【发布时间】:2014-12-27 05:11:42
【问题描述】:

我正在学习 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 中的验证以及测试文件之间的关系,所以这可能是我感到困惑的原因。

【问题讨论】:

    标签: ruby-on-rails ruby validation


    【解决方案1】:

    在测试中,您需要确保您的代码按预期执行所有操作。在这种情况下,您无法使用超过 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)
    

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-04
        相关资源
        最近更新 更多