【问题标题】:What "validation logic" should I test?我应该测试什么“验证逻辑”?
【发布时间】:2011-11-19 09:09:16
【问题描述】:

我正在使用 Ruby on Rails 3.0.9 和 RSpec 2。我想知道我应该测试什么“验证逻辑”。也就是说,如果在我的模型中我有:

class User < ActiveRecord::Base
  validates :firstname
    :presence => true
end

我应该对以下内容进行哪些测试?

  1. “应该一个有效的名字”
  2. “应该没有有效的名字”

或者我应该同时测试两者?

【问题讨论】:

  • 在这个问题中,我假设您有兴趣专门测试名称的“存在”方面,而不是任何其他“有效性”。也许你应该澄清一下。

标签: ruby-on-rails ruby ruby-on-rails-3 validation rspec


【解决方案1】:

您可以通过简单地执行以下操作来测试两者:

it "should validate presence of" do
   should validate_presence_of :firstname
end

查看shoulda matchers 了解所有此类标准 Rails 验证。

【讨论】:

    【解决方案2】:

    我认为你不应该同时测试两者。这样就足够了:

    describe User do
      it { should validate_presence_of(:firstname) }
    end
    

    【讨论】:

      【解决方案3】:

      基本上没有验证名称的算法,因为名称的形式非常以文化为中心。因此,实际上您应该避免对人名之类的东西进行复杂的验证。例如,某些地方/文化没有姓氏,因此即使验证它们的存在也不合适。有一整套其他示例使验证名称成为一个非常糟糕的主意。有关验证名称本身问题的更多信息,请参阅我对 this question 的回答。

      话虽如此,一般来说,在验证任何字段时,我都会测试有效和无效数据。我确保,当我将字段设置为有效值时,.valid? 方法返回 true,当它无效时,它返回 false

      通常你不需要做一个很长的列表,你只需要测试

      • 一个典型的有效和无效例子
      • 一些极端情况

      【讨论】:

        【解决方案4】:

        您还可以测试特定值:

        describe User do    
            context "validations" do
                it { should_not allow_value("admin").for(:firstname) }
                it { should allow_value("JohnDoe").for(:firstname) }
            end    
        end
        

        【讨论】:

          猜你喜欢
          • 2010-09-30
          • 2010-12-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多