Rails使用minitest和fixture进行模型测试

时间:2015-04-15 18:12:58

标签: ruby-on-rails ruby-on-rails-4 fixtures 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>'

我在内部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设置永久链接。

1 个答案:

答案 0 :(得分:2)

您添加了一个before_validation,当您调用valid?方法时,它会触发before_validation钩子,当您将其设置为公司名称时,在这种情况下,comapny的名称为default,这样您就可以了在控制台中将其设置为&#39;默认&#39;。

您是在before_validation挂钩中明确设置固定链接并对其进行无效情况测试,这是不可能的。