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

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top