RSpec 中是否可以有参数化规格?

发布于 2024-10-13 14:07:30 字数 461 浏览 3 评论 0原文

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

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

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

If I have a spec that needs to be run with different values to have it drive a real implementation and not a naive one. An example:

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

So far I haven't found any way to pass 3 in as a parameter. The spec below solves my problem but I'm wondering if it's the recommended way to do it or if there is any other, better way.

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

I don't like this because it uses loops, it's not readable and it only shows up as one spec when run, I would rather have it show up as two different tests.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

征棹 2024-10-20 14:07:30

要生成单独的测试,您可以执行以下操作:

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

由于规范文件可以简单地作为 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

To generate separate tests you could do:

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

Because spec files are simple run as ruby scripts you can use all the standard ruby constructs to generate tests on the fly.

Even better you can use Numeric#step to easily generate a certain range of tests, e.g. for [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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文