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 и не добавит никакой ценности?



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



Чем вы обычно занимаетесь?

538   3  

3 ответов:

Все сводится к тому, почему вы тестируете в первую очередь. Цель набора тестов-предупредить разработчиков в случае, если что-то сломано, чтобы они могли это исправить. ИМО двойное тестирование является формой отходов, так как цель набора тестов была выполнена, если после написания одного теста.

Короче говоря, я считаю, что это нормально, чтобы проверить его только в rSpec, если ваш тест огурца не тестирует что-то другое.

Мои два цента: забудь про огурец. Необходимость держать еще один цельный DSL в голове и поддерживать шаги приводит к большому количеству потерянного времени в долгосрочной перспективе (особенно если вы работаете самостоятельно). RSpec-это гораздо лучший способ, поскольку он ближе к обычному Ruby, и вы, вероятно, можете даже перейти к MiniTest::Spec довольно легко. Не стирайте ваши тесты огурца все сразу, но удаляйте их, когда они терпят неудачу, и заменяйте их спецификациями.

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

Я думаю, что наличие проверочных тестов только в RSpec недостаточно. Если вы хотите убедиться, что пользователь может видеть сообщение об ошибке, вы должны использовать Cucumber/Capybara/Jasmine...

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

Мой подход заключается в том, что я тестирую каждую проверку в RSpec + один сценарий Cucumber на форму с провалом одной проверки.

Comments

    Ничего не найдено.