2014-02-26 43 views
7

對不起,我很沮喪,現在想出更好的東西。法拉第的紅寶石碎片,無法上手

我有一個類,Judge,它有一個方法#stats。這統計方法應該發送一個GET請求到api並獲取一些數據作爲響應。我試圖測試這個和存根統計方法,以便我不執行實際的請求。這是我的測試樣子:

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 

這是我測試類:

class Judge 

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

end 

目前這給我的錯誤:Faraday does not implement: get 那麼,你如何與法拉第存根呢?我見過類似的方法:

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

但我似乎無法以正確的方式應用它。我在這裏錯過了什麼?

回答

1

法拉第類沒有get方法,只有實例確實。既然你是在一個類的方法使用這個你可以做的是這樣的:

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 

然後在您的測試,你可以只設置一個雙:

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

拿回這看起來整潔。獲取「雙:連接收到意外的消息:存根(:get)」,tho。哪一個是意料之外的:存根方法或:get? :s – Majoren

+0

你使用的是什麼版本的rspec?你使用rspec mocks或其他一些模擬庫嗎? –

+0

rspec:3.0.0.beta2,WebMock:1.17.3 – Majoren

0

我遇到了同樣的問題出現Faraday::Adapter::Test::StubsFaraday does not implement: get錯誤。看來你需要設置stubs到法拉第適配器,就像這樣:

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

注意Faraday.new返回法拉第::連接,而不是法拉第的一個實例。所以,你可以嘗試使用

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

需要注意的是,如果返回「一些數據」作爲你的問題所示我不知道是正確的,因爲法拉第:: Connection.get應該返回一個響應對象,其中將包括身體和狀態代碼而不是字符串。你可以嘗試這樣的事:

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

這裏有一個導軌控制檯,顯示類,你從Faraday.new

$ 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