Ich bin mir sicher, dass mein Problem ziemlich einfach zu lösen ist. Jedoch kann ich nicht finden, wie oder wo man es löst. Derzeit versuche ich die #follow
Methode auf meinem Benutzermodell zu testen. Hier ist der Test, die ich habe:Rspec & FactoryGirl 'Kann nicht erstellen, wenn Eltern nicht gespeichert wird'
describe "#follow & #following?" do
before(:each) do
@other_user = FactoryGirl.create(:user)
end
it "returns false for user following other_user" do
expect(@user.following?(@other_user)).to eq(false)
end
it "returns true for user following other_user" do
@user.follow(@other_user)
expect(@user.following?(@other_user)).to eq(true)
end
end
Hier wird die #follow
Methode:
def follow(other_user)
active_relationships.create(followed_id: other_user.id)
end
Der Fehler, der zurückgegeben wird, ist You cannot call create unless the parent is saved
. Offensichtlich ist das in Frage stehende Elternteil hier . Jetzt läuft der erste Test wie vorgesehen ab, da wir offensichtlich keine Methode aufrufen, die create wie beim Ausführen der Methode #follow
aufruft. Meine Frage ist, wie würde ich diese @other_user
speichern, so dass ich eine active_relationship
erstellen kann.
Hier ist, wie @user
präsentiert wird:
before { @user = FactoryGirl.build(:user) }
subject { @user }
Auch @user
ist mit allen anderen Tests arbeiten. Wenn .persisted?
auf beiden @user
& @other_user
ausgeführt wird, erhalte ich true
.
In der Spec-Datei, wo und wie '@ ist user' erstellt werden? –
Wird wirklich der '@ other_user' nicht gespeichert? Ich vermute, dass '@ user' nicht gespeichert wird. Rufen Sie '' beharrt? '' Auf beiden an, um das zu testen. Außerdem möchten Sie vielleicht "Fehler" bei beiden nennen, vielleicht gibt die Fabrik keine gültigen Instanzen zurück. – spickermann
'FactoryGirl.build (: user)' gibt einen unsave-Benutzer zurück, ich bezweifle, dass '@ user.persisted?' Returns 'true' ... Bitte fügen Sie' @ user.save' vor '@ user.follow (@other_user) hinzu 'und test ob das dein Beispiel passiere ... – spickermann