Я тест в MiniTest:Rails Модель тест с MiniTest и арматурой
class CompanyTest < ActiveSupport::TestCase
def setup
@company = companies(:default)
end
test 'permalink should present' do
@company.permalink = " "
assert_not @company.valid?
end
end
Крепеж для дефолтной компании:
default:
name: 'default'
website: 'www.example.com'
permalink: 'default'
У меня есть проверки на модели компании, как (company.rb) :
validates :permalink, presence: true, uniqueness: true
before_validation :add_permalink
private
def add_permalink
self.permalink = self.name.to_s.parameterize
end
Удивительно, но тест не работает.
test_0001_permalink should present FAIL (95.55s)
Minitest::Assertion: Expected true to be nil or false
test/models/company_test.rb:31:in `block in <class:CompanyTest>'
я поставил binding.pry на внутренние рельсы активной модели валидатора: ActiveModel::Validations::PresenceValidator
class PresenceValidator < EachValidator # :nodoc:
def validate_each(record, attr_name, value)
binding.pry
record.errors.add(attr_name, :blank, options) if value.blank?
end
end
Здесь рекорд до сих пор имеет постоянную ссылку как default
.
[1] pry(#<ActiveRecord::Validations::PresenceValidator>)> record
=> #<Company:0x007f9ca5375070
id: 593363170,
name: "default",
created_at: Wed, 15 Apr 2015 17:59:56 UTC +00:00,
updated_at: Wed, 15 Apr 2015 17:59:56 UTC +00:00,
website: "www.example.com",
permalink: "default"
Может кто-нибудь помочь мне понять, почему тест не удается, и поэтому запись в ActiveModel::Validations::PresenceValidator
еще точно совпадает с данными арматуры?
ОБНОВЛЕНИЕ: Его из-за before_validate, который по существу устанавливает постоянную ссылку в соответствии с name
.
Вы уверены, что хотите assert_not @ company.valid? Вы тестируете недействительную компанию? Похоже, что он получает «дефолт», который ему нужен, с пробелом. – joncodo