RSpec e Open-URI come faccio deridono sollevare un Errore socket / TimeoutError
Domanda
Voglio essere in grado di spec che quando Open-Uri open () chiamate sia timeout o sollevare un'eccezione come Errore socket sto trattamento delle cose come previsto, ma sto avendo problemi con questo.
Ecco il mio spec (per Errore socket):
@obj.should_receive(:open).with("some_url").and_raise(SocketError)
E la parte del mio oggetto in cui sto usando open-uri:
begin
resp = open(url)
resp = resp.read
rescue SocketError
something = true
end
Tuttavia, in questa situazione, le specifiche non riesce, come con un errore nil.read
.
Questa è la seconda volta questa settimana ho incontrato questo problema, la volta precedente stavo tentando di simulare un TimeoutError quando la confezione open()
con un timeout() {}
, che il tempo ho rinunciato e appena ha causato un vero e proprio timeout per accadere con l'apertura la classe. I potrebbe , ovviamente causare questo per gettare un Errore socket cercando di chiamare un URL non valido, ma sono sicuro che ci sia un modo corretto per deridere questo con RSpec.
Aggiornamento:. Io, ovviamente, non pensavo chiaramente che a tarda notte, l'errore è stato in realtà quando ho ri-provato l'URL dopo l'Errore socket, l'and_raise (Errore socket) parte ha funzionato benissimo
Soluzione
La linea che hai fornito dovrebbe funzionare, sulla base delle informazioni che hai dato: ho fatto una piccola classe di test e specifiche (vedi sotto) con la sola funzionalità descritta, e le cose sono comportato come previsto. Potrebbe essere utile se si potesse fornire un po 'più di contesto -. Piena "it" isolato dalla specifica, per esempio, potrebbe esporre qualche altro problema
Come accennato, le seguenti specifiche passa, e credo che cattura la logica si stava tentando di verificare:
require 'rubygems'
require 'spec'
class Foo
attr_accessor :socket_error
def get(url)
@socket_error = false
begin
resp = open(url)
resp = resp.read
rescue SocketError
@socket_error = true
end
end
end
describe Foo do
before do
@foo = Foo.new
end
it "should handle socket errors" do
@foo.should_receive(:open).with("http://www.google.com").and_raise(SocketError)
@foo.get("http://www.google.com")
@foo.socket_error.should be_true
end
end