我正在创建一些测试,我想创建一个将不同参数传递给构造函数的对象数组,是否有一种聪明的方法呢?
例如,假设我有这段代码:
foos = 3.times.map{ Foo.new("a") }
此代码会为我提供一个包含3个foo
的数组,但所有数组都使用"a"
参数初始化。
我宁愿有一个数组,其中第一个用"a"
初始化,第二个用"b"
初始化,第三个用"c"
初始化,就像这样做:
foos = [Foo.new("a"),Foo.new("b"),Foo.new("c")]
有更聪明的方法吗?
答案 0 :(得分:3)
试试这个
%w(a b c)
如果您不知道
["a", "b", "c"]
是一种较短的说法
a = [[2.802, 4.713, 9.581, 15.339, 22.273],
[np.nan, 7.647, 5.559, 7.317, 10.250],
[np.nan, np.nan, 5.383, 0.184, -0.882],
[np.nan, np.nan, np.nan, -3.992, -11.124],
[np.nan, np.nan, np.nan, np.nan, -20.192]]
b = np.nanmin(a, axis=0)
b
array([ 2.802, 4.713, 5.383, -3.992, -20.192])
答案 1 :(得分:3)
更深入地了解您的问题,我将建议您使用两个库:Factory Girl和Faker。没有Rails或Rspec特定。
使用Factory Girl,您可以定义工厂来创建测试数据,使用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>
以下是关于Factory Girl有多强大的more examples。请记住,您需要使用build*
方法而不是create*
方法,因为create*
方法在将save
方法与持久层一起使用时也会调用数据来保留数据。
答案 2 :(得分: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">]