2016-03-23 11 views
0

Ich habe eine sehr harte Zeit Simulation des Fehlschlags einer Zerstörungsmethode in meinem Controller.RSpec: Wie simuliere ich Fehler # Destroy korrekt

Mein Controller zerstören sieht wie folgt aus:

def destroy 
    project = Project.find(params[:id]) 
    project.destroy 

    if project.destroyed? 
    render json: { 
     project: nil, 
     message: "The project was successfully deleted" 
    } 
    else 
    render json: { 
     message: "Could not delete project", 
    }, status: :unprocessable_entity 
    end 
end 

Ich versuche, die json im else-Block in meinem Test zu machen, aber nicht erledigen. Bisher ist die speziellen Test sieht wie folgt aus:

describe "DELETE #destroy" do 

let!(:project) { create(:project, :open) } 

    context "when invalid" do 

    it "returns an error if the project was not deleted" do 
    expect(Project).to receive(:find).with(project.id.to_s).and_call_original 
    expect(project).to receive(:destroy).and_return(false) 
    delete :destroy, id: project 
    end 

end 
end 

Der Test liefert entweder den ‚Happy Path‘ oder gibt mir Fehler. Zur Zeit:

Failure/Error: expect(project).to receive(:destroy).and_return(false) 

     (#<Project:0x007f87cf5d46a8>).destroy(*(any args)) 
      expected: 1 time with any arguments 
      received: 0 times with any arguments 

Wenn jemand mich in der richtigen Richtung zeigen könnte, und erklären, wie ich ein 422 simulieren kann, wäre ich sehr dankbar!

Antwort

0

Sie wollen am Anfang zulassen, nicht erwarten. Erwarten ist der Behauptungsteil.

it "returns an error if the project was not deleted" do 
    allow(Project).to receive(:find).with(project.id.to_s).and_call_original 
    allow(project).to receive(:destroy).and_return(false) 

    delete :destroy, id: project 

    expect(Project).to have_received(:find) 
    expect(project).to have_received(:destroy) 
end 

Ich nehme an, Sie direkt mit

allow(Project).to receive(:find).with(project.id.to_s).and_call_original 

sind, aber ich habe das noch nie zuvor gesehen, ich würde

allow(Project).to receive(:find).with(project.id.to_s).and_return(project) 
+0

Vielen Dank für Ihre schnelle Antwort normalerweise tun! Das expect (project) .to received (: destroy) löst einen undefinierten Methodenfehler aus. Wenn ich den response.body auf die Konsole drucke, sehe ich immer noch den "Happy Path" -Ergebnis. Wie funktioniert das allow() und return (false)? – Iris

+0

Sorry @Iris das sollte 'have_received' sein. Im Wesentlichen ist es in [Rspecs Mocks] (https://relishapp.com/rspec/rspec-mocks/v/3-4/docs/basics/allowing-messages). Im Grunde sagt es nur rspec, dass das Projekt einen Aufruf zum "Zerstören" erhält und zurückgibt, was wir wollen, nämlich "falsch". Sie möchten weitere Aussagen hinzufügen, um die Nachricht/den Status zu überprüfen. –

+0

Danke @ j-dexx. Dargestellt und versucht es, aber jetzt bekomme ich wieder das 'Fehler/Fehler: expect (project) .to have_received (: zerstören) (# ). Zerstören (* (beliebige Argumente)) erwartet: 1 Zeit mit irgendwelchen Argumenten erhalten: 0 mal mit beliebigen Argumenten's nochmal :( – Iris

Verwandte Themen