2011-04-02 6 views
8

Каков наилучший способ проверить кучу различных тестовых случаев с RSpec?Схемы сценариев RSpec: несколько тестовых случаев

Например, при string-additions.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 шаблон для СУШКИ такого рода тестов с несколькими корпусами? Что-то похожее на Cucumber scenario outlines?

Примечание: этот вопрос аналогичен Is there an equivalent in RSpec to Cucumber's “Scenarios” or am I using RSpec the wrong way?, но представляет собой пример, который должен быть проверен с помощью RSpec, а не с огурцом.

ответ

9

После прочтения Elisabeth Hendrickson's Adventures with Auto-Generated Tests and 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 был шаблон, чтобы сделать вещи даже сушилка.

Смежные вопросы