2014-02-05 163 views
1

Ruby和Rails都是新手,使用Test::Unit開發應用程序。我來自PHP和PHPUnit的背景,他們爲data providers提供了正式結構:您可以在一個方法中定義參數的嵌套數組/散列,然後循環通過單個測試,交換每個過程中的參數。這是使用不同參數重複測試相同事件的簡明方法。Rails測試的數據提供者

我迄今發現的唯一的解決方法是手動複製的概念,一個單一的測試裏面:

test "should properly do something" do 
    provider = [ 
    {:var1 => 'foo',  :var2 => 'bar', :expected => true}, 
    {:var1 => 'foo',  :var2 => 'baz', :expected => true}, 
    {:var1 => 'invalid', :var2 => 'bar', :expected => false}, 
    # ... 
    ] 
    provider.each do |t| 
    assert_equal(t.expected, SomeObject.some_method(t.var1, t.var2)) 
    end 
end 

這並不讓我儘可能多的有用的測試輸出,因爲它不能辨別哪些循環實際上在發生錯誤時失敗。

有沒有更好的方法來做到這一點?

回答

2

可以只是重新格式化您的測試代碼如下所示:

[ 
    ['foo',  'bar', true ], 
    ['foo',  'baz', true ], 
    ['invalid', 'bar', false], 
    # … 
].each do |v1, v2, expected| 
    test "expecting #{expected} with #{v1} and #{v2}" do 
    assert_equal(expected, SomeObject.some_method(v1, v2)) 
    end 
end 

然而,使用Rails我找到RSpecFactoryGirl和更容易使用Faker/ffaker的組合。我還沒有創建針對該矩陣「數據提供者」和考驗,但指定的行爲(無論是測試::單位或RSpec的),像這樣:

test "expecting positive result" do 
    assert SomeObject.some_method('foo', 'bar') 
    assert SomeObject.some_method('foo', 'baz') 
    # … 
end 

test "expecting negative result" do 
    assert_false SomeObject.some_method('invalid', 'baz') 
    # … 
end 

或(RSpec的):

require 'spec_helper' 

describe SomeObject do 
    describe '#some_method' do 
    specify "positive result" do 
     expect(SomeObject.some_method 'foo', 'bar').to be true 
     expect(SomeObject.some_method 'foo', 'baz').to be true 
     # … 
    end 

    specify "negative result" do 
     expect(SomeObject.some_method 'invalid', 'bar').to be false 
     # … 
    end 
    end 
end 
+0

謝謝,DMKE!仍在挖掘Ruby/Rails測試。你的pref,Test :: Unit或RSpec是什麼?附:這個生態系統很龐大。 –

+0

我會強烈推薦RSpec。如果您需要閱讀材料,請查看Aaron Sumner [用RSpec進行的Everyday Rails測試](http://everydayrails.com/)。 – DMKE

0

我也有這個問題,我喜歡避免重複邏輯時唯一改變的是數據。然而,你可以發送一個字符串到Unit :: Test斷言,所以你可以將你的字符串存儲在數組中。

我在這發現的不便之處是,一旦測試失敗,其他人不會運行。另外,由於ruby不允許以逗號開頭的行,我不能僅僅暫時註釋一個測試,但這是另一個問題。

def testMergeNestedHash 

    data = 
    [ 
      [ 
        "merge two empty hashes, shourd return empty hash"      \ 
       , {}                  \ 
       , {}                  \ 
       , {}                  \ 
      ]                    \ 
                          \ 
     , [                    \ 
        "a simple nested merge"             \ 
       , { a: { b: 'one', c: 'two'    } }        \ 
       , { a: { e: 'three'      } }        \ 
       , { a: { b: 'one', c: 'two', e: 'three' } }        \ 
      ]                    \ 
                          \ 
     , [                    \ 
        "override an existing non-hash element"         \ 
       , { a: { b: 'one' , c: 'two'    } }        \ 
       , { a: { b: 'four', e: 'three'   } }        \ 
       , { a: { b: 'four', c: 'two', e: 'three' } }        \ 
      ]                    \ 
    ] 


    data.each do | arr | 

     assert_equal(arr[ 3 ], arr[ 1 ].recursive_merge!(arr[ 2 ]), "\n\nTEST: " + arr[ 0 ] + "\n") 

    end 

end