Ошибка проверки Rspec - атрибут не может быть пустым, но он не пуст
Я только что написал тест для тестирования, если новое создание пользователя также состоит из настройки администратора. Вот тест:
describe User do
before(:each) do
@attr = {
:name => "Example User",
:email => "[email protected]",
:admin => "f"
}
end
it "should create a new instance given valid attributes" do
User.create!(@attr)
end
it "should require a name" do
no_name_user = User.new(@attr.merge(:name => ""))
no_name_user.should_not be_valid
end
it "should require an email" do
no_email_user = User.new(@attr.merge(:email => ""))
no_email_user.should_not be_valid
end
it "should require an admin setting" do
no_admin_user = User.new(@attr.merge(:admin => ""))
no_admin_user.should_not be_valid
end
end
Затем в моей модели User я:
class User < ActiveRecord::Base
attr_accessible :name, :email, :admin
has_many :ownerships
has_many :projects, :through => :ownerships
email_regex = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i
validates :name, :presence => true,
:length => { :maximum => 50 }
validates :email, :presence => true,
:format => { :with => email_regex },
:uniqueness => { :case_sensitive => false }
validates :admin, :presence => true
end
Я ясно создал нового пользователя с настройкой администратора, так почему он говорит это false? Я создал миграцию для настройки администратора как admin: boolean. Я сделал что-то не так?
Здесь ошибка:
Failures:
1) User should create a new instance given valid attributes
Failure/Error: User.create!(@attr)
ActiveRecord::RecordInvalid:
Validation failed: Admin can't be blank
# ./spec/models/user_spec.rb:14:in `block (2 levels) in <top (required)>'
Как ни странно, когда я прохожу проверку валидатов: admin,: presence = > true, тест корректно создает пользователя, но не работает "Пользователь должен задать настройку администратора"
EDIT: Когда я изменяю значение @attr: admin на "t", это работает! Почему он не работает, когда значение false?
Ответы
Ответ 1
Из направляющих рельсов:
Так как false.blank? верно, если вы хотите проверить наличие boolean field вы должны использовать validates: field_name,: include = > {: in = > [true, false]}.
В принципе, похоже, что ActiveRecord преобразует ваш "f" в false
до проверки, а затем он запускает false.blank?
и возвращает true
(это означает, что поле НЕ присутствует), в результате чего валидация не выполняется, Итак, чтобы исправить это в вашем случае, измените свою проверку:
validates :admin, :inclusion => { :in => [true, false] }
Кажется, немного взломанный для меня... надеюсь, разработчики Rails пересмотрят это в будущей версии.