在RSpec中组织具有因子组合的测试的最佳方法

Dav*_*lla 10 ruby csv rspec

我正在创建一些具有各种输入的测试.我正在测试一个购买网站,其中包含新的和返回的用户类型,不同的产品,促销代码,付款选项.我觉得这是一个数据驱动的测试集,可能需要测试输入的csv或电子表格格式.

我一直在使用rspec,它非常适合我创建的最后一个测试集.

我想要一致的结果格式.我坚持如何使用RSpec数据表.有没有人使用RSpec和测试输入表?

提前感谢您提供直接解决方案或合理的建议.

Ste*_*sen 18

如果您打算使用表格,我会在测试文件中将其定义为...

[
  %w( abc  123  def  ),
  %w( wxyz 9876 ab   ),
  %w( mn   10   pqrs )
].each do |a,b,c|
  describe "Given inputs #{a} and #{b}" do
    it "returns #{c}" do
      Something.whatever(a,b).should == c
    end
  end
end
Run Code Online (Sandbox Code Playgroud)


Pat*_*ren 5

一种惯用的方法是使用带有参数的RSpec共享示例。我将假设每个表格行对应一个不同的测试用例,并且列分解所涉及的变量。

例如,假设您有一些代码可以根据汽车的配置计算汽车的价格。假设我们有一个类Car,我们想测试该price方法是否符合制造商的建议零售价 (MSRP)。

我们可能需要测试以下组合:

门| 颜色 | 室内 | 建议零售价
--------------------------------
4 | 蓝色 | 布| $X
2 | 红色 | 皮革 | $Y

让我们创建一个共享示例来捕获此信息并测试正确的行为。

RSpec.shared_examples "msrp" do |doors, color, interior, msrp|
  context "with #{doors} doors, #{color}, #{interior}" do
    subject { Car.new(doors, color, interior).price }
    it { should eq(msrp) }
  end
end
Run Code Online (Sandbox Code Playgroud)

编写了这个共享示例后,我们可以简洁地测试多个配置,而无需重复代码。

RSpec.describe Car do
  describe "#price" do
    it_should_behave_like "msrp", 4, "Blue", "Cloth", X
    it_should_behave_like "msrp", 2, "Red", "Leather", Y
  end
end
Run Code Online (Sandbox Code Playgroud)

当我们运行这个规范时,输出应该是这样的:

车
  #价钱
    它应该表现得像 msrp
      当 4 门时,蓝色,布料
        应该等于 X
      当 2 门时,红色,皮革
        应该等于 Y