Можно ли параметризовать спецификации в 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