2017-04-15 8 views
1

Ich erstelle einige Tests und ich möchte ein Array von Objekten erstellen, die verschiedene Parameter an den Konstruktor übergeben, gibt es eine kluge Möglichkeit, das zu tun?Wie man mit verschiedenen Parametern abbildet - ruby ​​

Zum Beispiel nehme ich an diesen Code haben:

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

Dieser Code mich mit 3 foo ‚s ein Array geben würde, aber alle von ihnen mit dem "a" Parameter initialisiert.

Ich würde eher einen Array, wo die erste mit "a", den zweiten mit "b" und dem dritter mit "c" initialisiert wird, wie wäre es, wenn dies tut:

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

Gibt es eine intelligentere Art und Weise zu tun, Dies?

Antwort

3

Versuchen Sie diesen

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

Falls Sie nicht wissen,

%w(a b c) 

ein kürzerer Weg zu sagen,

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

Könnte genauer gesagt sein: "Eine kürzere Art zu sagen" ['a', 'b', 'c'] '" da% w keine String-Interpolation wie% W erlaubt. Ja, pingelig. –

2

nur eine Alternative zu bieten:

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

Gehen Sie ein wenig tiefer auf Ihre Frage, ich werde Ihnen zwei Bibliotheken vorschlagen: Factory Girl und Faker. Keine ist Rails noch Rspec spezifisch.

Mit Factory Girl können Sie Fabriken definieren, um Testdaten zu erstellen, und mit Faker können Sie Ihren Fabriken randomisierte Daten zuordnen.

Ich schlage diese beiden Bibliotheken vor, weil das Erstellen von Testdaten für einfache Anwendungsfälle einfach ist, aber es wird sehr kompliziert, wenn Sie komplexere Beziehungen zwischen Objekten haben.

Hier ist ein Beispiel für den Einstieg:

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> 

Hier sind more examples auf, wie mächtig Factory Girl ist. Denken Sie daran, dass Sie die Methoden build* anstelle von create* verwenden müssen, da create* Methoden auch save aufrufen, um die Daten bei Verwendung mit einer Persistenzschicht persistent zu machen.

Verwandte Themen