2016-03-27 6 views
0

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.

+1

In der Spec-Datei, wo und wie '@ ist user' erstellt werden? –

+1

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

+1

'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

Antwort

3

Sie @user wird nicht gespeichert, weil Factory.build(:user) nicht gespeicherten Datensätze zurückgibt. Ändern Sie einfach Ihre Spezifikationen, um @user zu speichern, bevor Sie dieses bestimmte Beispiel ausführen.

ich die Spezifikationen so schreiben würde:

subject(:user) { FactoryGirl.build(:user) } 

describe "#follow & #following?" do 
    let(:other) { FactoryGirl.create(:user) } 

    it "returns false for user following other_user" do 
    expect(user.following?(other)).to be_false 
    end 

    context "when following" do 
    before do 
     user.save 
     user.follow(other) 
    end 

    it "returns true for user following other_user" do 
     expect(user.following?(other)).to be_true 
    end 
    end 
end 
0

Wie @spickermann aufgezeigt hat. Das tatsächliche Elternteil in Frage war @user und NICHT @other_user. Da ich nur building der Benutzer war, wurde ein nicht gespeichertes Objekt zurückgegeben. Das erlaubt uns nicht, ein active_relationship auf einem Objekt zu erstellen, das noch gespeichert werden musste. Durch Ändern von build in create wurde das Problem behoben.

Dank Spickermann und Ben Y für ihre Teilnahme

Verwandte Themen