如何映射不同的参数 - ruby
问题描述:
我创建了一些测试,我想创建一个对象数组传递不同的参数给构造函数,是否有一个聪明的方法呢?如何映射不同的参数 - ruby
例如,假设我有这样的代码:
foos = 3.times.map{ Foo.new("a") }
这段代码给我一份有3 foo
的数组,但他们都与"a"
参数初始化。
我宁愿有其中第一个与"a"
初始化数组,第二与"b"
第三有"c"
,就像它将如果这样做:
foos = [Foo.new("a"),Foo.new("b"),Foo.new("c")]
是否有这样做的一个更聪明的方式这个?
答
试试这个
%w(a b c).map { |s| Foo.new(s) }
如果你不知道
%w(a b c)
就是
["a", "b", "c"]
答
只是为了提供一种替代更短的方式:
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">]
答
对你的问题进行更深入的研究,我会建议你两个库:Factory Girl和Faker。没有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
来保留数据。
由于'%w'不允许像'%W'这样的字符串插值,可能会更准确地说'a','b','c']''的简短方式。是的,尼特采摘。 –