对不起,标题,我感到很沮丧,无法提出更好的建议。

我有一个类Judge,它有一个方法#stats。此stats方法应该将GET请求发送到api并获取一些数据作为响应。我正在尝试对此进行测试,并将stats方法 stub ,以便不执行实际的请求。这是我的测试结果:

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):
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

但是我似乎无法正确地应用它。我在这里想念什么?

最佳答案

请注意,Faraday.new返回Faraday::Connection的实例,而不是Faraday。所以你可以尝试使用

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

请注意,我不知道您的问题中所示的返回“某些数据”是否正确,因为Faraday::Connection.get应该返回一个响应对象,该响应对象将包含正文和状态码而不是字符串。您可以尝试如下操作:
allow_any_instance_of(Faraday::Connection).to receive(:get).and_return(
   double("response", status: 200, body: "some data")
)

这是一个Rails控制台,显示您从Faraday.new返回的类(class)
$ 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

10-08 11:34