2017-04-15 66 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来保留数据。