Возможно ли иметь параметризованные спецификации в RSpec? - PullRequest
15 голосов
/ 23 января 2011

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

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 Ответ

20 голосов
/ 23 января 2011

Для генерации отдельных тестов вы можете сделать:

[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
...