Должен ли я создавать тесты для пользовательских проверок во время TDD? Или я должен проверить достоверность всего объекта? - PullRequest
1 голос
/ 02 февраля 2012

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

Предположим, у меня естьпользовательская проверка:

User < ActiveRecord::Base
  validate :weird_validation

  def weird_validation
    # Validate the weird attribute
  end
end

Должен ли я использовать этот подход:

context "validation"
  it "pass the validation with weird stuff" do
    user = User.new weird: "something weird"
    user.should be_valid
  end


  it "should't pass the validation with normal stuff" do
    user = User.new weird: "something"
    user.should_not be_valid
    user.errors[:weird].size.should eq 1
  end
end

Или этот:

context "#weird_validation" do
  it "should not add an error if weird is weird" do
    user = User.new
    user.stub(:weird){"something weird"}
    user.errors.should_not_receive :add
    user.weird_validation.should eq true
  end

  it "should add an error if weird is not weird" do
    user = User.new
    user.stub(:weird){"something"}
    user.errors.should_receive(:add).with(:weird, anything())
    user.weird_validation.should eq false
  end
end

Так что ИМХО

Первый подход

Плюсы

  • Это тест поведения
  • Легкий рефакторинг

Минусы

  • Зависит отдругие методы
  • Что-то не связанное может привести к сбою теста

Второй подход

Плюсы

  • Это ни на что не влияетиначе, так как все остальное задернуто
  • Это очень специфично для всех вещей, которые должен делать код

Минусы

  • Это очень специфично для всех вещейкод должен делать
  • Рефакторинг проверок может потенциально нарушить тест

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

Используя второй подход, я практически пишу код дважды, что кажется пустой тратой времени и усилий.Но я тестирую единичный метод на предмет того, что он должен делать.(и я лично делаю это для каждого метода, который, на мой взгляд, очень плох и требует много времени)

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

1 Ответ

0 голосов
/ 02 февраля 2012

IMO, второй подход - лучший, потому что вы тестируете свойства и валидации вашей модели по одному (часть "unit").

Чтобы избежать накладных расходов, вы можете рассмотреть возможность использования shoulda . Это действительно эффективно для модульного тестирования моделей. Обычно мы используем комбинацию factory_girl / mocha / musta для функционального тестирования (factory_girl и mocha также очень полезны для тестирования запросов и именованных областей). Тесты легко писать, читать и поддерживать:

# class UserTest < ActiveSupport::TestCase
# or
# describe 'User' do

  should have_db_column(:weird).of_type(:string).with_options(:limit=>255)
  should allow_value("something weird").for(:weird)
  should_not allow_value("something").for(:weird)
  should ensure_length_of(:weird).is_at_least(1).is_at_most(255)

# end

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

...