Я очень новичок в области 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
Так что ИМХО
Первый подход
Плюсы
- Это тест поведения
- Легкий рефакторинг
Минусы
- Зависит отдругие методы
- Что-то не связанное может привести к сбою теста
Второй подход
Плюсы
- Это ни на что не влияетиначе, так как все остальное задернуто
- Это очень специфично для всех вещей, которые должен делать код
Минусы
- Это очень специфично для всех вещейкод должен делать
- Рефакторинг проверок может потенциально нарушить тест
Я лично считаю, что исправлениеЭтот подход должен быть первым, но я не могу не думать, что я слишком полагаюсь на другие методы, а не на тот, который хочу тестировать, и если тест не пройден, это может быть из-за любого метода с моделью,Например, он не будет проверяться, если проверка другого атрибута не удалась.
Используя второй подход, я практически пишу код дважды, что кажется пустой тратой времени и усилий.Но я тестирую единичный метод на предмет того, что он должен делать.(и я лично делаю это для каждого метода, который, на мой взгляд, очень плох и требует много времени)
Есть ли какой-то промежуточный момент, когда речь идет об использовании заглушек и насмешек?Потому что я выбрал второй подход и думаю, что злоупотребляю им.