2013-07-01 6 views
6

Ich versuche, eine Controller-Methode mit dem folgenden Code zu testen:Nachladen ein Objekt nicht in der Arbeit rspec

it "should set an approved_at date and email the campaign's client" do 
    @campaign = Campaign.create(valid_attributes) 

    post :approve, id: @campaign.id.to_s 

    @campaign.reload 
    @campaign.approved_at.should_not be(nil) 
end 

Allerdings, wenn ich diesen Test ausführen, bekomme ich folgende Fehlermeldung:

Failure/Error: @campaign.reload 
ActiveRecord::RecordNotFound: 
    Couldn't find Campaign without an ID 

Wenn ich die analogen Linien in der Rails-Konsole starte, funktioniert das Reload und der Wert wird so eingestellt, wie ich es brauche. Warum funktioniert das Nachladen bei mir nicht, wenn ich den Code in einem rspec-Test ausführe?

Antwort

8

löste ich das Problem zu factory durch Umschalten:

@campaign = FactoryGirl.create(:pending_approval_campaign) 
    @campaign.approved_at.should be(nil) 

    post :approve, id: @campaign.id.to_s 

    @campaign.reload 
    @campaign.approved_at.should_not be(nil) 

Das wie vorgesehen funktioniert

1

ich einen Test laufen würde eine Campaign Datensatz, um sicherzustellen, wird tatsächlich erstellt:

@campaign = Campaign.create(valid_attributes) 
puts @campaign.id 

.reload der erste Platz in Ihrem Code ist, dass ein Null @campaign moniert einen Fehler (da Sie .to_s auf einem anrufen Nullobjekt)

1

Zwei mögliche Stellen für Fehler.

  1. Objekt erstellen. d. h. @campaign = Campaign.create(valid_attributes) Ihr Objekt wurde möglicherweise nicht korrekt erstellt. Ich empfehle Ihnen, create! anstelle von create im Test zu verwenden, damit irgendein Fehler geworfen wird.

  2. Steuerung. Wenn der Controller das Objekt mit einer Integer-ID erwartet, geben Sie ihm eine Zeichenfolge. Das kann auch das Problem sein. Ich schlage vor, dass Sie die ID nicht in eine Zeichenfolge konvertieren. Wenn für GET, können Sie das tun, obwohl nicht notwendig. Wenn für POST die Konvertierung in Zeichenfolge falsch ist.