2016-08-07 48 views
1

Ich muss einen Test meiner App lösen. Coverage beschwert sich über eine Codezeile, die die Verbindung zu MongoDB (rescue Mongo::Error::NoServerAvailable => _e) auswertet und den Fehler rendert.Wie testen Mongo Verbindung Fehlerbehandlung mit RSpec

Was denken Sie, ich sollte diese testen:

def index 
    render json: Complex.all.to_json 
rescue Mongo::Error::NoServerAvailable => _e 
    render json: { error_description: 'no database available' }, status: 503 
end 

ich mit so etwas wie zu testen, versuche:

it 'should return an exception' do 
    get :index 
    expect(response).to raise_exception 
end 

Ich fand, dass ich

.and_raise(IOError) 
verwenden sollten

Aber ich bin mir nicht sicher, wo ich es verwenden soll, damit es auf die Linie fällt. Eigentlich kann ich es auf die Ausnahme fallen lassen, wenn ich Mongo stoppe, aber das ist nicht die Idee.

Danke für Ihre Zeit.

+0

@DaveSchweisguth dieses weit nicht viel Glück. Ich weiß, dass ich es mit expect (response) testen muss. To raise_exception Es klingt gut, aber ich habe nicht den Weg gefunden, die Aktion auf den Rettungsfehler fallen zu lassen. Rettung Mongo :: Fehler :: NoServerAvailable => _e – moplin

Antwort

1

Um die Codezeile zu erreichen, die die Ausnahme verarbeitet, stub Complex.all.to_json, um die Ausnahme auszulösen. Da Complex.all.json angekettet ist, braucht es ein wenig zusätzlichen Aufwand, um es zu stubben. Da die Ausnahme behandelt wird, können Sie nicht testen, dass sie ausgelöst wird. Testen Sie stattdessen das Ergebnis der Handhabung.

it 'should handle the exception' do 
    all = double 
    allow(all).to receive(:to_json).and_raise Mongo::Error::NoServerAvailable 
    allow(Complex).to receive(:all).and_return all 
    get :index 
    expect(response.status).to eq(503) 
    expect(response.body).to include('no database available') 
    # you could test the JSON more thoroughly, but you get the idea 
end 

Sie könnten receive_message_chain verwenden Complex.all.to_json mit weniger Code Stummel. Ich habe die lange Version benutzt, weil es einfacher ist zu verstehen, was vor sich geht.

+0

Vielen Dank bro. Nahm mich ein wenig, damit es funktioniert. Aber es hat geholfen. – moplin

+0

Fühlen Sie sich frei, einige Details für zukünftige Spötter hinzuzufügen, und jeder von uns kann unsere Beiträge aktualisieren. –