Rails:我应该使用Cucumber,RSpec还是两者测试验证?

时间:2014-02-24 22:41:14

标签: ruby-on-rails rspec cucumber

我一直在使用RSpec和Cucumber几个月。但由于我是这里唯一的开发人员,所以一直都是自学,所以我要求这一点澄清在哪里测试。

我正在为Coupon创建一个CMS。有一张表格可以创建新的优惠券。我有幸在黄瓜工作和测试的道路。我是否还应该对表格填写错误的时间进行测试?如果是这样,我是否应该为每个未通过验证的案例创建场景?

我已经在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

是否有必要测试我的验证然后在Cucumber中解雇?或者那只是重复我的RSpec测试而不是添加任何值?

或许我应该只有一个测试提交表单而不填写任何内容并测试错误是否显示在页面上?

你们通常做什么?

3 个答案:

答案 0 :(得分:1)

我的两分钱:忘了黄瓜。从长远来看,不得不将另一整个DSL放在头脑中并保持步骤会导致大量浪费时间(特别是如果你自己工作的话)。 RSpec是一个更好的方法,因为它更接近普通的Ruby,你甚至可以很容易地过渡到MiniTest :: Spec。不要一次擦除黄瓜测试,但在失败时删除它们并用规格替换它们。

至于测试中的重复,我倾向于不介意它。由于您正在定义详细的场景及其预期结果,因此即使是经过良好重构的套件,重复的一系列测试也可以更明确,更容易理解。

答案 1 :(得分:0)

归结为你首先要测试的原因。测试套件的目标是在开发人员遇到破坏的情况下警告开发人员,以便他们能够修复它。 Imo双重测试是一种浪费,因为在编写一个测试后,测试套件的目标已经实现。

这么长的故事简短我认为只在rSpec中测试它是好的,除非你的黄瓜测试测试不同的东西。

答案 2 :(得分:0)

我认为仅在RSpec中进行验证测试是不够的。如果你想确保用户可以看到错误信息你必须使用Cucumber / Capybara / Jasmine ......

我同意测试Cucumber中的所有验证都不是一个好主意。 但是,为每个表单测试一个验证可能会非常有用。

我的方法是我在RSpec中测试每个验证+每个表单的一个Cucumber场景,并且验证失败。