2016-06-03 15 views
3

Ich möchte die ersten zwei Aufrufe an HTTParty mit ausgelöstem Ausnahme und dann, der dritte Aufruf, sollte Wert zurückgeben.RSpec Reihenfolge der zurückgegebenen Werte UND ausgelöst Fehler aus Stub

before do 
      allow(HTTParty).to receive(:get).exactly(2).times.with(url).and_raise(HTTParty::Error) 
      allow(HTTParty).to receive(:get).with(url).and_return('{}') 
     end 

aber man darf einen anderen überschreiben. wie man Stub setzt, um Fehler für die ersten paar Versuche zu erhöhen, und dann einen Wert zurückgeben lassen?

+0

einen Blick auf WebMock nehmen, vor allem [Mehrere Antworten gekettet 'to_return mit()', 'to_raise()' oder 'to_timeout' Erklärungen] (https://github.com/blbke/webmock#multiple-responses-using-chained-to_return-to_raise-or-to_timeout-declarations) – Stefan

+0

@Stefan sieht sehr vernünftig aus! Sie können es in Antwort verwandeln :) –

Antwort

3

Gemäß den Angaben in this github issue können Sie dies auch mit dem folgenden reinen RSpec-Ansatz tun. Es nutzt die allgemeinste Art von definiert Scheinantworten using block:

before do 
    reponse_values = [:raise, :raise, '{}'] 
    allow(HTTParty).to receive(:get).exactly(3).times.with(url) do 
    v = response_values.shift 
    v == :raise ? raise(HTTParty::Error) : v 
    end 
end 
+1

Nizza! Wenn Sie 'reponse_values ​​= [nil, nil, '{}']' setzen, können Sie das einfache 'response_values.shift || verwenden Raise (HTTParty :: Error) 'Trick aus dem GitHub-Problem. – Stefan

+0

Das stimmt! Obwohl ich in diesem Fall die "Explizitheit" eher mag. – BoraMa