2016-07-29 6 views
0

Ich benutze Ruby 2.2.1 und Rails 4.2.0Rspec testet die Wiederverwendung von Objekten

Ich füge Testfälle hinzu, um ein Modul abzudecken. Das Modul führt grundsätzlich einige QA-Prüfungen von Daten aus, die von einem anderen System übernommen wurden. Das Problem, das ich habe, ist, dass in Testfällen eine Iteration innerhalb des Moduls das gleiche Objekt anstelle der einzelnen Objekte für die einzelnen Testfälle wiederverwendet.

Beispieltestfälle:

... 

it "should add issue case 1" do 
    trip = FactoryGirl.build(:trip, :case_1) 
    p trip.object_id # 7...8660 
    subject.do_qa(trip) 
    expect(trip.issue_1).not_to be_nil 
end 

it "should add issue case 2" do 
    trip = FactoryGirl.build(:trip, :case_2) 
    p trip.object_id # 7...2780 
    subject.do_qa(trip) 
    expect(trip.issue_2).not_to be_nil 
end 

... 

Probennahmemodul:

module Qa 

    ... 

    def self.do_qa(trips) 
    p trips.object_id # Same is the object id in the calling test case 
    @trips ||= Array.wrap(trips) 
    @trips.each do |t| 
     p t.object_id # Always the object id from the first test case! 
     ... # Checks for case 1 and case 2 
    end 
    end 

    ... 

end 

weil die Schleife wird erneut unter Verwendung des Objekts, übergibt der zweite Testfall nie, weil das Modul gerade neu Auswerten das erste trip Objekt. Gibt es eine Möglichkeit, es zu zwingen, ein neues Objekt in der Schleife zu instantiieren?

+0

Es gibt einen schrecklichen Weg, und es könnte einen schöneren Weg geben, aber wir müssten mehr Code sehen. Welche anderen Methoden in "Qa" beziehen sich auf "@ trips"? Welche Klasse beinhaltet 'Qa'? Was ist "Thema" in Ihren Tests? ([RSpecs Thema ist meistens eine schlechte Sache.] (Http://stackoverflow.com/questions/38437162/whats-the-difference-between-rspecs-subject-and-let-when-should-the-y-use-used)) –

Antwort

0

Die Antwort darauf war mein Mangel an vollem Verständnis von Ruby vs. anderen Sprachen. Grundsätzlich gilt: Obwohl ein Modul nicht als Klasse definiert ist, ist es immer noch eine Klasse hinter den Kulissen und die Instanzvariablen bleiben zwischen den Läufen gesetzt. Dies war in meiner Anwendung kein Problem, da sich nichts darauf verließ, dass sie zwischen Methodenaufrufen gelöscht wurden.

Fall 1 und Fall 2 in der ursprünglichen Frage verwendet tatsächlich die gleiche Instanz der Qa Klasse, so natürlich auch die Instanzvariablen das ursprüngliche trip Objekt enthalten, da ich den ||= Operator wurde noch gehen.

Ich löste es, indem ich einen before(:each) Block an den Anfang des relevanten Kontextes mit Qa.instance_variable_set(:@trips, []) hinzufüge, um sicherzustellen, dass die Variable in einem sauberen Zustand beginnt.

+0

Ja, oder Sie könnten richtige OOP und nicht Daten im globalen Zustand speichern. Bedeutung, tatsächlich instanziieren Sie eine "Qa" -Klasse und arbeiten mit einem __instance__, nicht die __class__. –

Verwandte Themen