【问题标题】:Rails Custom Validators: Testing optionsRails 自定义验证器:测试选项
【发布时间】:2012-03-07 12:19:37
【问题描述】:

我正在尝试编写一个涉及(除其他外)一些自定义模型验证器的 Rails gem...我想知道如何测试验证选项。

举个例子,我想写一个 rspec 测试,如果 allow_nil 选项为真,则空白字段返回有效,否则无效。代码工作正常,但我想不出一种优雅的方式来测试它。代码本身:

Module ActiveModel
  module Validations
    module ThirstyVals
      class ValidatePrime < EachValidator
        # Validate prime numbers
        def validate_each(record, attr_name, value)
          return if options[:allow_nil] && value.strip.length == 0

          # Other validation code here
          # ...
        end
      end
    end
  end
end

我目前正在通过一个虚拟项目进行测试,这很好,但我能想到的测试 :allow_nil 选项的唯一方法是编写一个设置了 :allow_nil 的新属性,并验证它的功能......这似乎既过分又非常不雅。必须有一种更优雅的方式 - 任何想法都值得赞赏。 (下面的其他测试供后代使用)

# ...
before(:each) do
  @entry = Entry.new
end

describe "it should accept valid prime numbers" do
  ['7', '13', '29'].each do |n|
    @entry.ticket = n
    @entry.valid?('ticket').should be_true
  end
end

describe "it should reject non-prime numbers" do
  ['4', '16', '33'].each do |n|
    @entry.ticket = n
    @entry.valid?('ticket').should be_false
  end
end

【问题讨论】:

    标签: ruby-on-rails ruby rubygems rspec


    【解决方案1】:

    您是否考虑过像这样单独测试验证器:

    在 validate_prime_spec.rb 中

    require path_to_validator_file
    
    describe ActiveModel::Validations::ThirstyVals::ValidatePrime do
      context :validate_each do
        it 'should do some stuff' do
          subject.validate_each(record, attr_name, value).should #some expectation
        end
      end
    end
    

    那么我是否可以建议您不需要测试 Rails 验证的 allow_nil 功能,因为它已经在 Rails 中测试过? (见:activemodel/test/cases/validations/inclusion_validation_test.rb line 44

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多