【问题标题】:Rails: Should I test validations using Cucumber, RSpec, or both?Rails:我应该使用 Cucumber、RSpec 还是同时使用两者来测试验证?
【发布时间】:2014-02-24 22:41:14
【问题描述】:

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

我目前正在为Coupons 创建一个 CMS。有一个创建新优惠券的表格。我有在 Cucumber 中工作和测试的快乐之路。我是否也应该对表格填写错误进行测试?如果是这样,我是否应该为每个未通过验证的案例创建一个场景?

我已经在 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 测试而不增加任何价值?

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

你们平时都做什么?

【问题讨论】:

    标签: ruby-on-rails rspec cucumber


    【解决方案1】:

    我的两分钱:忘掉黄瓜吧。从长远来看,必须在脑海中保留另一个完整的 DSL 并维护这些步骤会浪费大量时间(尤其是如果您自己工作)。 RSpec 是一种更好的方法,因为它更接近于普通的 Ruby,你甚至可以相当容易地过渡到 MiniTest::Spec。不要一次全部删除你的黄瓜测试,而是在它们失败时删除它们并用规范替换它们。

    至于测试中的重复,我倾向于不那么介意。由于您要定义详细的场景及其预期结果,因此与经过良好重构的套件相比,重复的一系列测试可能更明确、更容易理解。

    【讨论】:

    • 这很好,但您可能想提到用 rspec “功能”测试替换黄瓜。您仍然可以使用 capybara 或其他任何东西来测试完整的用户交互/集成,这一切都在 ruby​​ rspec 代码中,而不必通过详尽的正则表达式列表来提出黄瓜定义。我们不久前放弃了 cukes 并且没有回头,但我们仍然使用 Capybara 和 Poltergeist 进行测试,以确保用户看到我们希望他们看到的内容。 +1 虽然是“忘记黄瓜”位;)它确实会产生很多浪费。
    • 同意,@nzifnab。尽管我也放弃了大多数情况下的功能测试,而是更喜欢直接测试控制器。我通常可以通过测试流入和流出控制器的数据来获得所需的一切。结果,它为您提供了一个更快的测试套件,我并没有真正错过它。但是,由于来自黄瓜,我建议您坚持使用 Capybara 一段时间,至少在您对控制器测试非常有信心之前。
    • 嗯,也许...但是如果您的 javascript 和控制器之间有一些特殊的交互,那么单独的 just 控制器测试可能无法捕获所有内容。 Jasmine 肯定会对 JS 有所帮助......但我仍然发现使用 capybara 进行全栈点击以确保所有内容正确啮合在一起很有帮助。
    • 那么 Cucumber 真的不再使用了吗? Rails 开发人员是否开始倾向于只使用 rspec 而不是 cucumber?
    • @Edmund,Cucumber 肯定有它的优势(主要是非开发人员可以很容易地理解规范),但对于我自己的情况(除了我之外没有人在阅读它们),它不是适合工作的工具。我还没有真正调查过人们现在正在使用什么,但如果你好奇,请查看一些流行的 ruby​​ github repos 并查看测试套件。
    【解决方案2】:

    这首先取决于您为什么要进行测试。测试套件的目标是在出现问题时警告开发人员,以便他们修复它。 Imo 双重测试是一种浪费,因为如果在编写一个测试之后,测试套件的目标就已经实现了。

    长话短说,我认为仅在 rSpec 中对其进行测试就可以了,除非您的黄瓜测试正在测试不同的东西。

    【讨论】:

    • 我断言集成测试(在本例中为 cucumber)可用于确保错误完全出现在表单上 - 但您绝对不需要测试那里的每个验证测试,您都应该在 rspec 单元测试中进行详尽的案例和边缘案例集,以便更快地对其进行测试。
    【解决方案3】:

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

    我同意在 Cucumber 中测试所有验证不是一个好主意。 但是,为每个表单测试一个验证可能真的很有帮助。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      相关资源
      最近更新 更多