【问题标题】:Is it possible to have parameterized specs in RSpec?是否可以在 RSpec 中有参数化规范?
【发布时间】:2011-01-23 18:53:15
【问题描述】:

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

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

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

【问题讨论】:

    标签: ruby tdd rspec rspec2


    【解决方案1】:

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

    [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​​ 脚本运行,所以您可以使用所有标准 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
    

    【讨论】:

    • 不起眼的#each技术非常有效!我制作了一个小型 DSL,以使使用 RSpec 进行参数化测试更方便:github.com/odlp/rspec-with_params(它允许多个参数,并使用“给定 a => b,x => y,”上下文打印出每个组)
    猜你喜欢
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-05
    • 2018-01-27
    • 2011-09-10
    • 2017-09-18
    相关资源
    最近更新 更多