Rails - Как проверить validate_with - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть следующая модель с пользовательской проверкой действительного кода.

class MyAd < ApplicationRecord
  validates_with CodeValidator
end

и следующий класс:

class CodeValidator < ActiveModel::Validator
  def validate(record)
    code = record.ad_code

    return if is_double_id?(code) || is_id?(code)

    if code.blank? || code == 'NO_CODE'
      record.errors[:base] << "A valid code is required."
    end
  end

  def is_double_id?(code)
    code.match(regex here)
  end

  def is_id?(code)
    code.match(regex here)
  end
end

Как мне написать тест для этого? Я новичок в rails и принял этот код, поэтому я немного запутался в том, как это сделать.

Вот что я начал, но после прочтения я не уверен, как его протестировать. Вызывает ли MyAd.new () проверку?

require 'test_helper'

class MyAd < ActiveSupport::TestCase
  setup do
    @ad = MyAd.new(ad_code: 894578945)
  end

  test 'it test code validity' do
    #this is where i need help
  end

Буду признателен за любую помощь.

1 Ответ

1 голос
/ 14 апреля 2020

Просто установите действительный / недействительный экземпляр модели и вызовите #valid?, чтобы вызвать проверки. Затем вы можете написать утверждения об объекте ошибок .

require 'test_helper'

class MyAd < ActiveSupport::TestCase
  test 'it does not allow a blank code' do
    @ad = MyAd.new(code: '')
    @ad.valid? # fires the validations
    # @fixme your validator should actually be adding errors to :ad_code and not :base 
    assert_includes(@ad.errors[:base], 'A valid code is required.')
  end

  test 'it allows a valid code' do
    @ad = MyAd.new(code: 'SOME VALID CODE')
    @ad.valid? 
    refute_includes(@ad.errors[:base], 'A valid code is required.')
  end
end

Не проверять проверки с помощью:

# as popularized by the Rails tutorial book
assert(model.valid?)
refute(model.valid?)

Этот подход к бомбардировке ковров будет проверять каждую проверку на модель сразу, и вы действительно просто тестируете свою тестовую настройку.

Вызывает ли MyAd.new () проверку?

Нет. Проверки выполняются, когда вы вызываете #valid? или постоянные методы , такие как #save, .create и #update.

.
...