روبي تتعثر مع فاراداي، لا يمكن أن تجعلها تعمل
سؤال
آسف على العنوان، أشعر بالإحباط الشديد لعدم التوصل إلى أي شيء أفضل الآن.
عندي حصة دراسية، 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