我是最小的测试:
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>'
我在内部rails active-model验证器上放了一个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
设置永久链接。
答案 0 :(得分:2)
您添加了一个before_validation,当您调用valid?
方法时,它会触发before_validation钩子,当您将其设置为公司名称时,在这种情况下,comapny的名称为default
,这样您就可以了在控制台中将其设置为&#39;默认&#39;。
您是在before_validation挂钩中明确设置固定链接并对其进行无效情况测试,这是不可能的。