2014-02-26 4 views
7

제목이 불쌍해서 죄송합니다.루비가 faraday로 스터 빙하면 작동하지 않습니다

나는 Judge 클래스를 가지고 있는데,이 메소드는 #stats입니다. 이 통계 메서드는 API에 GET 요청을 보내고 응답으로 일부 데이터를 가져옵니다. 나는 이것을 테스트하고 stats 메서드를 스텁하여 실제 요청을 수행하지 않으려 고합니다. 이것은 내 테스트 모습입니다 :

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

에서 돌아 보여주는 레일 콘솔입니다. "Double : 연결 수신 예기치 않은 메시지 : 스텁 (: get)", tho. 예기치 않은 것 : 스텁 메소드 또는 : get? : s – Majoren

+0

어떤 rspec 버전을 사용하고 있습니까? rspec mocks 나 다른 mocking 라이브러리를 사용하고 있습니까? –

+0

rspec : 3.0.0.beta2, WebMock : 1.17.3 – Majoren

0

내가 같은 문제로 실행 Faraday::Adapter::Test::StubsFaraday does not implement: get으로 오류가 있습니다. Faraday.new는 패러데이 :: 연결하지 패러데이의 인스턴스를 반환

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

참고 : 당신과 같이, 패러데이 어댑터에 stubs을 설정해야 할 것 같다. 을 포함 할 것이다 패러데이 :: Connection.get는 응답 객체를 반환해야하기 때문에 그래서 당신은 당신의 질문과 같이 "일부 데이터"를 반환하는 경우 나, 올바른 모르는

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

주를 사용하여 시도 할 수 있습니다 문자열 대신 본문 및 상태 코드 당신은 이런 식으로 뭔가를 시도 할 수 있습니다 :

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