2012-03-07 58 views
2

我想寫一個涉及(除其他之外)一些自定義模型驗證器的軌道寶石...我想知道如何測試驗證選項。Rails自定義驗證器:測試選項

舉一個例子,我想寫一個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集,並驗證其功能......看起來既過度又不雅。必須有更優雅的方式 - 任何想法都會受到讚賞。 (以下爲後人其他測試)

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

回答

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中進行了測試,因此Rails驗證的allow_nil功能? (見:activemodel/test/cases/validations/inclusion_validation_test.rb line 44