2016-11-01 2 views
0

Ich habe Probleme mit einem RSpec-Test, und ich vermute, dass es mit meiner expliziten Verwendung des Betreffs im Vorher-Block zu tun hat. Insbesondere teste ich ActiveRecord-Objekte mit einer Beziehung has_many/soares_to. Das ist mein Fehler Test, bei dem ich versuche, zu behaupten, dass die Eltern ein bestimmtes Verhalten hat basierend auf dem Ereignis, das Kind der Zugabe:Warum wird das falsche Objekt in dieser RSpec-Konfiguration getestet?

subject { FactoryGirl.create(:parent) } 
let(:child) { FactoryGirl.build(:child) } 

context "with added child object" do 
    before { subject.children << child } 
    its(:foo) { is.expected_to eq("bar") 
end 

In meiner Eltern Modell, das ich einige einfache Logik basierend auf Hinzufügen des Kindes Aufzeichnung, die außerhalb des Tests funktioniert. Da es im Test nicht funktioniert, schaltete ich das spec Teil zum Schreiben aus Langform zu versuchen und zu verstehen, warum:

before do 
    puts "subject is #{subject}" 
    puts "child is #{child}" 
    subject.children << child 
    puts "#{child} is now attached to #{child.parent}" 
end 

it "has the correct response" do 
    puts "testing against subject #{subject}" 
    expect(subject.foo).to eq("bar") 
end 

Und die Ausgabe habe ich darauf hin, dass etwas Seltsames geschieht -, dass das Thema I befestigen das Kind ein andere zu dem in der Einrichtung und testen Blöcke:

subject is #<Parent:0x00561eddf1a7a0>             
child is #<Child:0x00561edcdd7fb0> 
#<Child:0x00561edcdd7fb0> is now attached to #<Parent:0x00561edd11c040> 
testing against subject #<Parent:0x00561eddf1a7a0> 

Bin ich etwas falsch mit Thema zu tun, dieses Verhalten zu verursachen? Gibt es eine bessere Möglichkeit, diesen Test zu schreiben?

aktualisiert basierend auf Vorschlag unter

Wenn ich den Test wie diese Struktur geht es, und die Ausgabe enthält kein Geheimnis zweite Version des Elternteil.

before do 
    child = FactoryGirl.create(:child, parent: parent)  
end 

it "has the correct response" do 
    # some puts to check the states of the various models here 
    expect(subject.foo).to eq("bar") 
end 

Dies ist jedoch nicht, wie Kunden der Klasse verwenden - es ist möglich, Kinder durch eine Reihe verschiedener Methoden an, und ich möchte das Modell unabhängig auf die gleiche Art und Weise verhalten.

Dies beantwortet auch nicht die Frage - wo ist das Extra-Objekt kommt aus der ersten Einrichtung?

+0

Ich verstehe nicht, was Sie tatsächlich testen? Die foo-Methode macht etwas mit den Kindern? Das Hinzufügen des Kindes zum Elternteil macht es nicht zum Thema. Das Thema wird immer noch das Elternteil sein, was passiert ist, was ich erwarten würde. –

+0

@dexx Ich teste das Verhalten einer der Methoden der Eltern basierend auf den Ereignissen, die ausgelöst werden, wenn das Kind hinzugefügt wird. Ich möchte, dass das Thema immer noch das Elternteil ist. Warum erwarten Sie, dass ein zweites Elternobjekt im Test erstellt wird, an das das Kind angehängt wird? Oder vielleicht war ich nicht klar genug, um das in der Frage hervorzuheben. – simple

+0

Ich sehe das Problem jetzt, ich habe mir das Thema angesehen und das Testen gegen Thema puts. Was ist in der Fabrik für das Kind? Ist 'child_to_attach' ein Tippfehler? oder eine andere lassen/Methode? –

Antwort

0

Können Sie versuchen, es wie folgt aus:

let(:parent) { FactoryGirl.create(:parent) } 
let(:child) { FactoryGirl.build(:child) } 
subject { parent } 

context "with added child object" do 
    before { parent.children << child } 
    its(:foo) { is.expected_to eq("bar") 
end 

Oder wenn Kind-Objekt eine Beziehung mit Elternteil hat dann:

let!(:parent) { FactoryGirl.create(:parent) } 
let!(:child) { FactoryGirl.build(:child, parent: parent) } 
subject { parent } 

context "with added child object" do 
    its(:foo) { is.expected_to eq("bar") 
end 

Lassen Sie mich wissen, das Ergebnis.

+0

Für das erste Beispiel, wo wir mithilfe des Bucket-Operators zuweisen, habe ich das gleiche Verhalten wie zuvor: Der Test schlägt fehl, und das Kind endet mit einem völlig anderen Elternteil (ich verstehe nicht warum). – simple

+0

Für das zweite Beispiel ist es das gleiche - es sei denn, ich "create" statt "build" das Kind, in welchem ​​Fall der Test besteht (!) Und das Kind endet richtig angebracht. Es scheint, dass mit dieser Bucket-Zuweisung etwas nicht in Ordnung ist, aber ich bin mir nicht sicher, was. – simple

+0

Möglicherweise müssen Sie tun, "parent.save!" Nach "parent.children << Kind" –

Verwandte Themen