2017-04-15 71 views
1

我創建了一些測試,我想創建一個對象數組傳遞不同的參數給構造函數,是否有一個聰明的方法呢?如何映射不同的參數 - ruby​​

例如,假設我有這樣的代碼:

foos = 3.times.map{ Foo.new("a") } 

這段代碼給我一份有3 foo的數組,但他們都與"a"參數初始化。

我寧願有其中第一個與"a"初始化數組,第二與"b"第三有"c",就像它將如果這樣做:

foos = [Foo.new("a"),Foo.new("b"),Foo.new("c")] 

是否有這樣做的一個更聰明的方式這個?

回答

3

試試這個

%w(a b c).map { |s| Foo.new(s) } 

如果你不知道

%w(a b c) 

就是

["a", "b", "c"] 
+3

由於'%w'不允許像'%W'這樣的字符串插值,可能會更準確地說'a','b','c']''的簡短方式。是的,尼特採摘。 –

2

只是爲了提供一種替代更短的方式:

arr = ['a', 'b', 'c'] 
Array.new(arr.size) { |i| Foo.new arr[i] } 
#=> 
#[#<Foo:0x000000025db798 @arg="a">, 
# #<Foo:0x000000025db748 @arg="b">, 
# #<Foo:0x000000025db6d0 @arg="c">] 
3

對你的問題進行更深入的研究,我會建議你兩個庫:Factory GirlFaker。沒有Rails和Rspec具體。

隨着工廠女孩,你可以定義工廠創建測試數據和與Faker你可以將隨機數據關聯到您的工廠。

我在建議這兩個庫,因爲爲簡單用例創建測試數據很容易,但當對象之間存在更復雜的關係時,它開始變得非常複雜。

下面是一個例子,讓你開始:

class Foo < Struct.new(:bar) 
end 

FactoryGirl.define do 
    factory :foo do 
    bar Faker::Number.digit 
    end 
end 

FactoryGirl.build_list(:foo, 3) 
=> [#<struct Foo bar=3>, #<struct Foo bar=2>, #<struct Foo bar=7>] 

FactoryGirl.build(:foo) 
=> #<struct Foo bar=5> 

    FactoryGirl.build(:foo, bar: 2) 
=> #<struct Foo bar=2> 

這裏有more examples在工廠女孩是多麼強大。請記住,您需要使用build*方法而不是create*方法,因爲create*方法在與持久層一起使用時也會調用save來保留數據。