是否可以在RSpec中使用参数化规范?

maz*_*maz 16 ruby tdd rspec rspec2

如果我有一个需要使用不同值运行的规范,以使其驱动真正的实现而不是一个天真的实现.一个例子:

it "should return 'fizz' for multiples of three" do  
  @fizzbuzz.get_value(3).should == "fizz"
end
Run Code Online (Sandbox Code Playgroud)

到目前为止,我还没有找到任何方法将3输入作为参数.下面的规范解决了我的问题,但我想知道这是否是推荐的方式,或者是否还有其他更好的方法.

it "should return 'fizz' for multiples of three" do  
  [3, 6].each{|number| @fizzbuzz.get_value(number).should == "fizz" }
end
Run Code Online (Sandbox Code Playgroud)

我不喜欢这个,因为它使用循环,它不可读,它只在运行时显示为一个规范,我宁愿让它显示为两个不同的测试.

Nem*_*157 21

要生成单独的测试,您可以:

[3, 6].each do |num|
  it "should return 'fizz' for multiples of three (#{num})" do  
    @fizzbuzz.get_value(num).should == "fizz"
  end
end
Run Code Online (Sandbox Code Playgroud)

因为spec文件很容易作为ruby脚本运行,所以你可以使用所有标准的ruby构造来动态生成测试.

更好的是,您可以使用Numeric#step轻松生成一定范围的测试,例如[3, 6, 9, 12, 15, 18]:

3.step(18, 3) do |num|
  it "should return 'fizz' for multiples of three (#{num})" do  
    @fizzbuzz.get_value(num).should == "fizz"
  end
end
Run Code Online (Sandbox Code Playgroud)