2016-05-15 24 views
0

Ich versuche, diesen Code zu testen:Wie testen Fehlerbehandlung mit RSpec?

mail = Mail.new 
mail.from = @from 
mail.to = to 
<...> 
begin 
    mail.deliver 
rescue 
    return false 
else 
    return true 
end 

für Fehler mit RSpec Handhabung:

it 'should return true if success' do 
    expect(mailer.send_confirmation_request(token)).to be true 
end 

it 'should return false if fails' do 
    allow_any_instance_of(Mail).to receive(:deliver).and_raise('Mail error') 
    expect(mailer.send_confirmation_request(token)).to be false 
end 

Aber es funktioniert nicht: zweiter Test nicht bestanden. Warum funktioniert allow_any_instance_of (und allow(Mail)) nicht auf diese Weise? Wie kann das getestet werden? Sollte ich meinen Code reparieren, um mehr testbar zu sein? Ich kann es testen, indem ich Mail # new mit rspec double stubbing, aber es führt dazu, alle Mail-Methoden zu stubben und sieht nicht wie ein richtiger Weg aus.

Wenn es egal ist, verwende ich mikel's mail gem und mache Tests nach seiner recommendations.

Antwort

1

Mail.new keine Instanz von Mail zurückkehren, gibt es eine Instanz von Mail::Message, so dass Sie allow_any_instance_of auf der falschen Klasse aufrufen.

Ich nehme an, die Bibliothek tut dies, um die Schnittstelle zu vereinfachen, aber es ist ein wenig kontraintuitiv.

+0

Sie haben definitiv Recht. [Hier ist] (https://github.com/mikel/mail/blob/master/lib/mail/mail.rb) passiert es auf der 50. Saite. Wirklich unerwartet. – Michael