Пользовательские валидаторы Rails: варианты тестирования - PullRequest
2 голосов
/ 07 марта 2012

Я пытаюсь написать жемчужину рельсов, которая включает (помимо прочего) некоторые пользовательские валидаторы моделей ... и мне интересно, как протестировать опции валидации.

Чтобы привести пример, я хотел бы написать тест 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

1 Ответ

0 голосов
/ 14 марта 2012

рассматривали ли вы тестирование валидатора изолированно так:

в 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

тогда могу ли я предложить вам не проверять функциональность allow_nil валидаций Rails из-за того, что он уже тестировался в Rails? (см .: activemodel / test / case / validations /lusion_validation_test.rb строка 44 )

...