Проверка логического значения в Rspec и Rails - PullRequest
9 голосов
/ 06 сентября 2010

Я очень запутался, как проверять логические значения в Rspec и Rails. Я понимаю, все, кроме false и nil, взяты как true в Ruby. Но когда я использую MySQL с Rails, он использует 1 для true и 0 для false (если мое понимание верно).

У меня есть следующая модель спецификации. Я хотел бы проверить логическое значение для атрибута superuser.

  • Как я могу написать спецификации здесь?
  • Как я могу написать здесь код реализации?
  • Являются ли мои спецификации и код реализации специфичными для конкретной базы данных (например, MySQL и PostgreSQL)?

    require 'spec_helper'
    describe User do
      before(:each) do
        @valid_attributes = {
          :username => "mike",
          :password => "super_encryped_password",
          :email => "mike@example.com",
          :superuser => true
        }  
      end
    
      it "should create a new instance given valid attributes" do
        User.create!(@valid_attributes)
      end
    
      it "should have true or false for superuser" do
        @valid_attributes[:superuser] = "hello"
        User.new(@valid_attributes).should have(1).error_on(:superuser)
      end
    end
    

Ответы [ 5 ]

7 голосов
/ 31 августа 2011

Это отличная дискуссия с некоторыми важными моментами: Rails автоматически проверяет логические поля, ложное значение приведет к сбою проверки «присутствия», и необходима специальная проверка, явно просматривающая истинные ложные настройки, если вы хотите убедиться, что логическое поле не ноль, но имеет истинное значение true или false.

Быстрое обновление для Rails 3.x: помощник включения:

http://guides.rubyonrails.org/active_record_validations_callbacks.html#inclusion

С помощью этого помощника проверка того, что логическое поле имеет значение true или false, выглядит следующим образом:

validates :superuser, :inclusion => {:in => [true, false], :message => 'requires a true or false value' }

Сообщение является необязательным и, как отмечается в документации, по умолчанию значение "не включено в список".

Похоже, что онлайн-консенсус заключается не в том, чтобы явно утвердить истину или ложь, а в том, чтобы позволить рельсам позаботиться об этом. Однако я столкнулся с ситуацией, когда явные проверки выявили проблему в базе данных (для полей MySql tinyint было установлено значение 2 или 4 вместо 1), что вызвало странное поведение. Поля могут быть установлены в true или false, но значение не может быть прочитано как логическое значение. Другими словами, валидация Rails прошла через это, но явная валидация включения пометила все те случаи, когда база данных была неправильно сконфигурирована. Так что это может быть одной из веских причин для проверки этих записей. Надеюсь это поможет. Charles

0 голосов
/ 15 сентября 2010

Одна важная вещь заключается в том, что ActiveRecord выполняет типизацию за кулисами, поэтому вам не нужно беспокоиться о том, как ваша база данных хранит логические значения.Вам даже не нужно проверять, что поле является логическим, если вы устанавливаете это поле как логическое при подготовке к миграции.Возможно, вы захотите убедиться, что поле не nil, с объявлением validates_presence_of :superuser в классе вашей модели.

0 голосов
/ 12 сентября 2010

Основываясь на ответе Джордини:

def superuser_boolean
  errors.add(:superuser, "Should be a boolean") if [true, false].include?(superuser)
end

Нет уродливых is_a проверок, просто include?.

0 голосов
/ 14 сентября 2010

def булево? (Val) !! val == val конец

Включите его в ваш spec_helper или расширьте rspec с помощью be_boolean.

0 голосов
/ 06 сентября 2010

Полагаю, вы хотите, чтобы "должно иметь значение true или false для суперпользователя". Но если вы хотите, чтобы он потерпел неудачу, вы должны добавить проверку пользователя:

validate :superuser_boolean

def superuser_boolean
  errors.add(:superuser, "Should be a boolean") if !superuser.is_a?(TrueClass) && !superuser.is_a?(FalseClass)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...