与法拉第的红宝石残肢,不能让它工作

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

我有一个课, Judge ,它有一个方法#stats 。 这个stats方法应该向api发送一个GET请求并获取一些数据作为响应。 我试图测试这个和存根统计方法,以便我不执行实际的请求。 这是我的测试看起来像:

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

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


请注意,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")
)

这是一个轨道控制台,显示您从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

法拉第课没有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

然后在你的测试中,你可以设置一个double:

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

我遇到了Faraday::Adapter::Test::Stubs错误与Faraday 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
链接地址: http://www.djcxy.com/p/77727.html

上一篇: Ruby stubbing with faraday, can't get it to work

下一篇: CSS opacity filter faster than opacity property?