Rails: должен ли я тестировать валидации с использованием Cucumber, RSpec или обоих?
Я использую RSpec и огурец в течение нескольких месяцев. Но так как я здесь единственный разработчик, все это было самообучение, поэтому я спрашиваю, чтобы уточнить, где и что тестировать.
В настоящее время я создаю CMS для Coupons. есть форма для создания нового купона. У меня есть счастливый путь, работающий и испытанный в огурце. Должен ли я также иметь тест, когда форма заполнена неправильно? Если да,то должен ли я создавать сценарий для каждого случая, который не проходит мои проверки?
I мои валидации уже протестированы в RSpec:
it { should validate_presence_of(:name) }
it { should validate_presence_of(:code) }
describe "validations" do
specify "the start date must be before the end date" do
site_wide_coupon = SiteWideCoupon.new(name: "Free Shipping", code: "ABC123")
site_wide_coupon.start_date = 1.month.from_now
site_wide_coupon.end_date = 1.month.ago
expect(site_wide_coupon.valid?).to be_false
expect(site_wide_coupon.errors.full_messages).to include("Start date must be before the end date")
end
context "it is a flat amount coupon" do
let(:site_wide_coupon) {
site_wide_coupon = SiteWideCoupon.new(name: "Flat Amount", code: "ABC123")
site_wide_coupon.start_date = 1.month.ago
site_wide_coupon.end_date = 1.month.from_now
site_wide_coupon.valid?
site_wide_coupon
}
it "validates presence of discount_amount" do
expect(site_wide_coupon.errors.full_messages).to include("Discount amount can't be blank")
end
it "doesn't validate the presence of discount_percentage" do
expect(site_wide_coupon.errors.full_messages).not_to include("Discount percentage can't be blank")
end
end
context "it is a percentage amount coupon" do
let(:site_wide_coupon) {
site_wide_coupon = SiteWideCoupon.new(name: "Percentage Amount", code: "ABC123")
site_wide_coupon.start_date = 1.month.ago
site_wide_coupon.end_date = 1.month.from_now
site_wide_coupon.valid?
site_wide_coupon
}
it "validates presence of discount_amount" do
expect(site_wide_coupon.errors.full_messages).to include("Discount percentage can't be blank")
end
it "doesn't validate the presence of discount_percentage" do
expect(site_wide_coupon.errors.full_messages).not_to include("Discount amount can't be blank")
end
end
end
describe "#flat_amount?" do
context "name equals 'Flat Amount'" do
it "returns true" do
site_wide_coupon = SiteWideCoupon.new(name: "Flat Amount")
expect(site_wide_coupon.flat_amount?).to be_true
end
end
context "name doesn't equal 'Flat Amount'" do
it "returns false" do
site_wide_coupon = SiteWideCoupon.new(name: "Something else")
expect(site_wide_coupon.flat_amount?).to be_false
end
end
end
describe "#percentage_amount?" do
context "name equals 'Percentage Amount'" do
it "returns true" do
site_wide_coupon = SiteWideCoupon.new(name: "Percentage Amount")
expect(site_wide_coupon.flat_amount?).to be_true
end
end
context "name doesn't equal 'Flat Amount'" do
it "returns false" do
site_wide_coupon = SiteWideCoupon.new(name: "Something else")
expect(site_wide_coupon.flat_amount?).to be_false
end
end
end
Нужно ли было бы тогда проверять, что мои проверки срабатывают в огурце? Или это будет просто повторение моих тестов RSpec и не добавит никакой ценности?
Или, может быть, у меня должен быть только один тест, который отправляет форму, ничего не заполняя и проверяя, что ошибки появляются на странице?
Чем вы обычно занимаетесь?
3 ответов:
Все сводится к тому, почему вы тестируете в первую очередь. Цель набора тестов-предупредить разработчиков в случае, если что-то сломано, чтобы они могли это исправить. ИМО двойное тестирование является формой отходов, так как цель набора тестов была выполнена, если после написания одного теста.
Короче говоря, я считаю, что это нормально, чтобы проверить его только в rSpec, если ваш тест огурца не тестирует что-то другое.
Мои два цента: забудь про огурец. Необходимость держать еще один цельный DSL в голове и поддерживать шаги приводит к большому количеству потерянного времени в долгосрочной перспективе (особенно если вы работаете самостоятельно). RSpec-это гораздо лучший способ, поскольку он ближе к обычному Ruby, и вы, вероятно, можете даже перейти к MiniTest::Spec довольно легко. Не стирайте ваши тесты огурца все сразу, но удаляйте их, когда они терпят неудачу, и заменяйте их спецификациями.
Что касается дублирования в тестах, то я, как правило, не и не забывай об этом. Поскольку вы определяете детальные сценарии и их ожидаемые результаты, повторяющаяся серия тестов может быть более явной и более понятной, чем даже хорошо переработанный набор.
Я думаю, что наличие проверочных тестов только в RSpec недостаточно. Если вы хотите убедиться, что пользователь может видеть сообщение об ошибке, вы должны использовать Cucumber/Capybara/Jasmine...
Я согласен, что тестирование всех валидаций в Cucumber не является хорошей идеей. Однако тестирование одной проверки на форму может быть действительно полезным.
Мой подход заключается в том, что я тестирую каждую проверку в RSpec + один сценарий Cucumber на форму с провалом одной проверки.
Comments