Rails自定义验证器:测试选项

时间:2012-03-07 12:19:37

标签: ruby-on-rails ruby rubygems rspec

我试图写一个涉及(其中包括)一些自定义模型验证器的rails gem ......我想知道如何测试验证选项。

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

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 set,并验证其功能。 ..这似乎既过分又相当不优雅。必须有一个更优雅的方式 - 任何想法赞赏。 (下面的其他测试为后人)

# ...
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

1 个答案:

答案 0 :(得分:0)

您是否考虑过孤立地测试验证器:

在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