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

时间:2011-01-23 18:53:15

标签: ruby tdd rspec rspec2

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

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

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

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

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

1 个答案:

答案 0 :(得分:20)

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

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

因为spec文件很简单,所以可以使用所有标准的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