2011-04-02 85 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而不是Cucumber進行測試的示例。

回答

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的模板,使事情變得機。