Контуры сценария RSpec: несколько тестовых случаев - PullRequest
8 голосов
/ 02 апреля 2011

Как лучше всего протестировать несколько различных тестовых примеров с помощью RSpec?

Например, задано string-дополнения. Rb :

require 'rspec'

class String
  if method_defined? :reverse_words
    raise "String#reverse_words is already defined"
  end
  def reverse_words
    split(' ').reverse!.join(' ')
  end
end

describe String do
  describe "#reverse_words" do
    specify { "hello".reverse_words.should eq("hello") }
    specify { "hello world".reverse_words.should eq("world hello") }
    specify { "bob & pop run".reverse_words.should eq("run pop & bob") }
  end
end

когда я запускаю rspec string-additions.rb --color --format doc, я получаю:

String
  #reverse_words
    should == hello
    should == world hello
    should == run pop & bob

Тем не менее, я хотел бы получить разумный вывод, как это:

String
  #reverse_words
    "hello" => "hello"
    "hello world" => "world hello"
    "bob & pop run" => "run pop & bob"

И я бы хотел DRY немного улучшить мои характеристики. Предоставляет ли RSpec шаблон для СУШЕНИЯ такого рода тестирования нескольких случаев? Что-то похожее на Огуречный сценарий: ?

Примечание: этот вопрос похож на Есть ли в RSpec эквивалент «сценариев» Cucumber или я неправильно использую RSpec? , но предоставляет пример, который следует тестировать с RSpec, а не с Cucumber.

1 Ответ

9 голосов
/ 02 апреля 2011

Прочитав Приключения Элизабет Хендриксон с автоматически сгенерированными тестами и RSpec , я предложил следующее решение:

describe String do
  describe "#reverse_words" do
    strings = {
      "hello"         => "hello",
      "hello world"   => "world hello",
      "bob & pop run" => "run pop & bob"
    }

    strings.each do |k, v|
      specify "\"#{k}\" => \"#{v}\"" do
        k.reverse_words.should eq(v)
      end
    end
  end
end

Это дает вывод, который я хочу, но было бы лучше, если бы у RSpec был шаблон, позволяющий сделать вещи более СУХОЙ.

...