2014-02-26 32 views
7

Sorry für den Titel, ich bin zu frustriert, um etwas besseres jetzt zu finden.Ruby Stubbing mit Faraday, kann es nicht zur Arbeit

Ich habe eine Klasse, Judge, die eine Methode #stats hat. Diese Statistik Methode soll eine GET-Anfrage an eine API senden und einige Daten als Antwort erhalten. Ich versuche dies zu testen und stats die stats-Methode, so dass ich keine tatsächliche Anfrage ausführen. Dies ist, was mein Test wie folgt aussieht:

describe Judge do 
    describe '.stats' do 

    context 'when success' do 
     subject { Judge.stats } 

     it 'returns stats' do 
     allow(Faraday).to receive(:get).and_return('some data') 

     expect(subject.status).to eq 200 
     expect(subject).to be_success 
     end 
    end 
    end 
end 

Dies ist die Klasse-I-Tests sind:

class Judge 

    def self.stats 
    Faraday.get "some-domain-dot-com/stats" 
    end 

end 

Das gibt mir zur Zeit die Fehler: Faraday does not implement: get So Wie Stummel Sie diese mit faraday? Ich habe Methoden wie gesehen:

stubs = Faraday::Adapter::Test::Stubs.new do |stub| 
     stub.get('http://stats-api.com') { [200, {}, 'Lorem ipsum'] } 
    end 

Aber ich kann nicht scheinen, es richtig anzuwenden. Was fehlt mir hier?

Antwort

1

Faraday die Klasse hat keine get Methode, nur die Instanz tut. Da Sie dies in einer Klassenmethode verwenden, was können Sie tun, ist so etwas wie dieses:

class Judge 
    def self.stats 
    connection.get "some-domain-dot-com/stats" 
    end 

    def self.connection=(val) 
    @connection = val 
    end 

    def self.connection 
    @connection ||= Faraday.new(some stuff to build up connection) 
    end 
end 

Dann in Ihrem Test können Sie nur ein Doppel eingerichtet:

let(:connection) { double :connection, get: nil } 
before do 
    allow(connection).to receive(:get).with("some-domain-dot-com/stats").and_return('some data') 
    Judge.connection = connection 
end 
+0

Diese ordentlich aussehen. Getting "Double: Verbindung empfangen unerwartete Nachricht: Stub mit (: get)", tho. Welche ist unerwartet die: Stub-Methode oder die: Get? : s – Majoren

+0

Welche Version von rspec verwenden Sie? Benutzt du Rspec Mocks oder irgendeine andere Mocking Library? –

+0

rspec: 3.0.0.beta2, WebMock: 1.17.3 – Majoren

0

Ich lief in das gleiche Problem mit Faraday::Adapter::Test::Stubs Fehler mit Faraday does not implement: get. Es scheint, Sie stubs auf einen Faraday-Adapter, wie so festlegen müssen:

stubs = Faraday::Adapter::Test::Stubs.new do |stub| 
    stub.get("some-domain-dot-com/stats") { |env| [200, {}, 'egg'] } 
    end 

    test = Faraday.new do |builder| 
    builder.adapter :test, stubs 
    end 

    allow(Faraday).to receive(:new).and_return(test) 

    expect(Judge.stats.body).to eq "egg" 
    expect(Judge.stats.status).to eq 200 
3

Beachten Sie, dass Faraday.new gibt eine Instanz von Faraday :: Verbindung, nicht Faraday. So können Sie versuchen,

allow_any_instance_of(Faraday::Connection).to receive(:get).and_return("some data") 

Beachten Sie, dass ich weiß nicht, ob „einige Daten“ Rückkehr wie in Ihrer Frage gezeigt ist korrekt, denn Faraday :: Connection.get sollten eine Antwort-Objekt zurück, das die umfassen würde Body und Statuscode anstelle einer Zeichenfolge. so etwas wie diese Sie könnten versuchen:

allow_any_instance_of(Faraday::Connection).to receive(:get).and_return(
    double("response", status: 200, body: "some data") 
) 

Hier sind eine Schienen-Konsole, die die Klasse zeigen Sie von Faraday.new zurück

$ rails c 
Loading development environment (Rails 4.1.5) 
2.1.2 :001 > fara = Faraday.new 
=> #<Faraday::Connection:0x0000010abcdd28 @parallel_manager=nil, @headers={"User-Agent"=>"Faraday v0.9.1"}, @params={}, @options=#<Faraday::RequestOptions (empty)>, @ssl=#<Faraday::SSLOptions (empty)>, @default_parallel_manager=nil, @builder=#<Faraday::RackBuilder:0x0000010abcd990 @handlers=[Faraday::Request::UrlEncoded, Faraday::Adapter::NetHttp]>, @url_prefix=#<URI::HTTP:0x0000010abcd378 URL:http:/>, @proxy=nil> 
2.1.2 :002 > fara.class 
=> Faraday::Connection