سؤال

آسف على العنوان، أشعر بالإحباط الشديد لعدم التوصل إلى أي شيء أفضل الآن.

عندي حصة دراسية، Judge, ، والذي له طريقة #stats.هذا احصائيات من المفترض أن ترسل الطريقة طلب 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")
)

إليك وحدة تحكم 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

نصائح أخرى

فاراداي الطبقة لا يوجد لديه 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

واجهت نفس المشكلة مع 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top