Подтвердить что ты не робот

Нужно ли проверять собственные проверки в рельсах?

Все знают, что автоматическое тестирование - это хорошо.

Не все знают, что тестировать.

Мой вопрос в том, должны ли тестироваться встроенные проверки, такие как validate_presence_of, validate_uniqueness_of и т.д.

В моем офисе нас трое, каждый думает, что их нужно проверять, думается, что это не должно, и я в воздухе.

4b9b3361

Ответ 1

Да.

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

Если кто-то прокомментировал кучу кода проверки, а затем забыл раскомментировать его, это будет незамеченным и может вызвать всевозможные проблемы.

Я тестирую их не потому, что я думаю, что они не работают, но чтобы убедиться, что они присутствуют в моей модели, когда это требуется.

Ответ 2

У Мэтью Басса большой камень, который он выпустил для такого рода вещей. Он добавляет маркеры rspec, которые проверяют, чтобы проверка была на месте, без фактического запуска базового кода ActiveRecord. Подробнее об этом читайте здесь.

Он добавляет символы для проверки:

it_should_validate_presence_of     :first_name, :last_name, :email
it_should_validate_numericality_of :zip
it_should_validate_uniqueness_of   :email
it_should_validate_inclusion_of    :gender, :in => %w(Male Female)

Также сочетания для ассоциаций:

it_should_belong_to :employer
it_should_have_many :friends, :romans, :countrymen
it_should_have_one  :account
it_should_have_and_belong_to_many :comments

И еще несколько полезных дополнений:

# tests that User.count increases by 1
it_should_be_createable :with => {:first_name => 'Ed', :last_name => 'The Duck', :email => '[email protected]'}

# tests that the attribute is protected
it_should_protect :email

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

Ответ 3

Планируете ли вы писать модульные тесты для каждого отдельного оператора Ruby и метода API?

Ваши юнит-тесты должны проверять ваш собственный код, а не другие люди, - что их работа, зачем дублировать их работу? И если вы не доверяете им хорошо выполнять свою работу, почему вы используете свой код?

Ответ 4

Вот здесь действительно полезны такие инструменты, как Shoulda. Я думаю, что это полностью зависит от вас, чтобы проверить, как вы пишете код с помощью инструментов, которые люди предоставляют вам. Просто потому, что вы используете has_many, не означает, что вы используете его правильно!

Серьезно, если вы интегрируете Shoulda в микс, становится тривиально проверять подобные вещи. если вы запустите rcov, он расскажет вам, что весь написанный вами код не полностью протестирован, если вы не делаете.

Ответ 5

Проверьте код, который вы пишете. ActiveRecord имеет отличное покрытие для тестирования, включая покрытие для методов класса проверки.

Spec:

require 'spec_helper'

describe User do
  before(:each) do
    @user = User.new
  end

  it "should not be valid without an email" do
    @user.save.should be_false
    @user.should_not be_valid
    @user.email = "[email protected]"
    @user.should be_valid
    @user.save.should be_true
  end

end

Чтобы получить эту спецификацию, вам понадобится

class User < ActiveRecord::Base
  validates_presence_of :email
end