Ruby与法拉第存在争执,无法让它发挥作用

Maj*_*ren 11 ruby testing request stubbing faraday

对不起标题,我太沮丧了,现在想出更好的东西.

我有一个类,Judge它有一个方法#stats.该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
Run Code Online (Sandbox Code Playgroud)

这是我正在测试的课程:

class Judge

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

end
Run Code Online (Sandbox Code Playgroud)

这当前给了我错误:Faraday does not implement: get 那你如何用法拉​​第存根?我见过的方法如下:

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

但我似乎无法以正确的方式应用它.我在这里错过了什么?

Dan*_*iel 8

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

allow_any_instance_of(Faraday::Connection).to receive(:get).and_return("some data")
Run Code Online (Sandbox Code Playgroud)

请注意,我不知道返回问题中显示的"某些数据"是否正确,因为Faraday :: Connection.get应该返回一个响应对象,其中包括正文和状态代码而不是字符串.你可能会尝试这样的事情:

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

这是一个rails控制台,显示你从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
Run Code Online (Sandbox Code Playgroud)


PR *_*ead 6

这么晚了,但万一其他人也是这样,这对我有用 - 上述方法的组合:

  let(:json_data) { File.read Rails.root.join("..", "fixtures", "ror", "501100000267.json") }

  before do
    allow_any_instance_of(Faraday::Connection).to receive(:get).and_return(
      double(Faraday::Response, status: 200, body: json_data, success?: true)
    )
  end
Run Code Online (Sandbox Code Playgroud)

  • 这对我很有帮助。谢谢 (3认同)