2014-02-05 114 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