2015-04-15 5 views
0

Я тест в 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.

+0

Вы уверены, что хотите assert_not @ company.valid? Вы тестируете недействительную компанию? Похоже, что он получает «дефолт», который ему нужен, с пробелом. – joncodo

ответ

2

Вы добавили before_validation и когда вы вызываете valid? метод его запуска before_validation крючок и, как вы настраиваете его как название компании, и в этом случае имя компаний, входящих в default так, что вы получаете его в консоли, как «по умолчанию ».

Вы явно устанавливаете постоянную ссылку в hook before_validation и проверяете ее на недопустимый случай, что невозможно.

+0

Вы правы. Я понял это и опубликовал несколько минут назад в разделе редактирования. Как-то это не спасло! Благодарю. – Indyarocks

Смежные вопросы