Загрузка...

Ruby & Rails: веб-разработка с удовольствием

Ruby on Rails — фреймворк для создания веб-приложений. Является открытым программным обеспечением (лицензия MIT). Здесь мы обсуждаем новости RoR, делимся учебными материалами и интересными находками С RoR даже сложные веб-приложения могут быть написаны за считанные дни. Это действительно разработка с удовольствием!
     

Тестируем уникальность поля с помощью shoulda и rspec

31.08.11, 23:22
Автор ggg

Очень многие разработчики Ruby вообще и Rails в частности используют Rspec для тестирования своих приложений. В этой короткой заметки я хочу рассказать об алгоритме проверки уникальности поля в Active Record модели.

Валидация уникальности поля (к примеру поля email в модели User) выглядит следующим образом:

class User < ActiveRecord::Base
  # Для Rails 2
  validates_uniqueness_of :email
  # Для Rails 3
  validates :email, :uniqueness => true
end

Для того, чтобы протестировать этот код в spec-файл необходимо добавить следующую спецификацию:

describe User
 before(:each) do
   User.create!(:email => 'test@mail.ru')
 end

  it { should validate_uniqueness_of(:email) }
end

Отметим, что метод validate_uniqueness_of требует наличия хотя бы одной записи тестируемого класса в базе. Это связано с особенностью алгоритма проверки, который состоит из следующих простых шагов:

  1. извлекаем первую запись тестируемой модели из базы
  2. клонируем ее
  3. пытаемся сохранить
  4. смотрим ошибки валидации на тестируемое поле

Теперь расскажу о небольшой заминке с которой я столкнулся на днях. Предположим, что в разрабатываемом приложении есть модель Feedback, которая хранит отзывы пользователей. Один пользователь может оставить только 1 отзыв. С другой стороны анонимный посетитель сайта тоже имеет возможность оставить отзыв. Код модели выглит следующим образом:

class Feedback < ActiveRecord::Base
  belongs_to :user
  validates :user_id, :uniqueness => true, :allow_nil => true
end

Для тестирования работы проверки уникальности был написан простой код:

describe Feedback
 before(:each) do
   Feedback.create!(:text => 'something')
 end

  it { should validate_uniqueness_of(:user_id) }
end

При запуске rspec спецификация проваливалась с ошибкой говорящей об успешном сохранении сдублированной записи (чего быть не должно). Как можно заметить, при создании записи поле user_id не заполняется. Поэтому после прохождения всех шагов алгоритма необходимой ошибки валидации не возникало. Чтобы исправить этот досадный недостаток перед проверкой валидации нужно создать запись с заполненным полем user_id.

Таким образом можно отметить, что знание принципов работы rspec и shoulda может существенно упрощает процесс написания спеков.

Комментарии

Войдите, чтобы оставить комментарий