Можно ли параметризовать спецификации в RSpec?

Если у меня есть спецификация, которую нужно запускать с разными значениями, чтобы она управляла реальной реализацией, а не наивной. Пример:

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

Мне это не нравится, потому что он использует циклы, он не читается и отображается только как один spec при запуске, я бы предпочел, чтобы он отображался как два разных теста.

Ответы

Ответ 1

Чтобы создать отдельные тесты, вы можете сделать:

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

Поскольку файлы спецификаций просты, как рубиновые скрипты, вы можете использовать все стандартные конструкции 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