2012-05-21 2 views
0

Использование Rails 3.1.1. Чтобы воспроизвести это, создайте новый проект Rails. Создайте новую модель в рамках этого проекта под названием «Пример». Создание миграции для этой модели, которая выглядит следующим образом ...Почему проверка правильности включения Rails не выполняется?

class CreateExamples < ActiveRecord::Migration 
    def change 
     create_table :examples do |t| 
      t.integer :status, :null => false 
      t.timestamps 
     end 
    end 
end 

Есть код посмотреть пример модель следующим образом ...

class Example < ActiveRecord::Base 
    VALID_VALUES = [0, 1, 2, 3] 

    validates :status, :presence => true, :inclusion => {:in => VALID_VALUES} 
end 

Теперь редактируют модульный тест для этой модели и добавьте следующее код к нему ...

require 'test_helper' 

class ExampleTest < ActiveSupport::TestCase 
    test "whats going on here" do 
     example = Example.new(:status => "string") 
     assert !example.save 
    end 
end 

Редактировать светильники файл так, что он не создает какие-либо записей, а затем запустить тест блока с помощью команды, например, как расслоение теста Exec грабель: единиц. Этот тест должен пройти, поскольку «строка» не является допустимым статусом, поэтому объект example должен возвращать false из вызова для сохранения. Этого не происходит. Если вы выберете 0 из массива VALID_VALUES, это сработает. Кто-нибудь знает, почему это может быть так?

+0

Вы уверены, что не хотите перечисления? – Reactormonk

ответ

4

«строка» отливают в виде целого числа (как в столбце состояния представляет собой целое число) перед проверкой

"string".to_i # => 0 

Вы можете избежать этого с помощью numericality валидатор:

validates :status, :presence => true, :numericality => { :only_integer => true }, :inclusion => {:in => VALID_VALUES} 

BTW, вам может использовать #valid? или #invalid? метод вместо #save в вашем тесте

+0

Спасибо, имеет смысл. – greybark

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