11

タイトルで申し訳ありませんが、今はイライラして、より良いものを思いつくことができません.

Judgeメソッドを持つクラス があり#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

しかし、私はそれを正しい方法で適用できないようです。ここで何が欠けていますか?

4

5 に答える 5

2

ファラデー クラスには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
于 2014-02-26T19:08:40.677 に答える
2

これは遅くなりましたが、他の誰かもそうである場合に備えて、これが私にとってうまくいったことです-上記のアプローチの組み合わせ:

  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
于 2021-03-24T15:12:17.513 に答える