الإستئصال طرق بالسلاسل مع Rspec
-
21-08-2019 - |
سؤال
وأريد أن أدعو على named_scope التي سيعود فقط سجل واحد، ولكن named_scope بإرجاع صفيف، وهذا ليس صفقة كبيرة ما أستطيع أن مجرد سلسلة لمع. أولا:
Model.named_scope(param).first
وهذا يعمل، ما أنا تكافح مع هو كيفية كعب الدعوة بالسلاسل. هل لديها إشارة أو إجابة على كيف سيكون التوجه نحو تحقيق هذا مع Rspec ساخرا؟
المحلول
وأنا أحسب شيئا.
Client.stub!(:named_scope).and_return(@clients = mock([Client]))
@clients.stub!(:first).and_return(@client = mock(Client))
والذي يتيح لي الفرصة لدعوة تحكم بلدي:
@client = Client.named_scope(param).first
وكان يعمل، ولكن هناك حل أفضل؟
وتحرير:
والافراج عن rspec 1.2.6 يسمح لنا باستخدام stub_chain وهذا يعني أنه يمكن الآن أن تكون:
Client.stub_chain(:named_scope, :chained_call).and_return(@clients = [mock(Client)])
وكان هذا العلوي من رأسي، ودائما التحقق من المعهد للحصول على تفاصيل:)
نصائح أخرى
ونسخة أفضل من
Client.stub!(:named_scope).and_return(@clients = mock([Client]))
@clients.stub!(:first).and_return(@client = mock(Client))
وعلى النحو التالي:
Client.should_receive(:named_scope).with(param).and_return do
record = mock_model(Comm)
record.should_receive(:do_something_else)
[record]
end
والسؤال هو قديم جدا، وبالتالي هناك بعض التحسينات في كيفية الإستئصال يمكن القيام به. الآن يمكنك استخدام stub_chain طريقة لكعب سلسلة من استدعاءات الأسلوب. على سبيل المثال:
و@client = Client.named_scope(param).first
ويمكن فافات مع:
وClient.stub_chain(:named_scope,:first).and_return(@client = mock(Client))
والمزيد من الأمثلة على stub_chaining:
describe "stubbing a chain of methods" do
subject { Object.new }
context "given symbols representing methods" do
it "returns the correct value" do
subject.stub_chain(:one, :two, :three).and_return(:four)
subject.one.two.three.should eq(:four)
end
end
context "given a string of methods separated by dots" do
it "returns the correct value" do
subject.stub_chain("one.two.three").and_return(:four)
subject.one.two.three.should eq(:four)
end
end
end
<وأ href = "https://www.relishapp.com/rspec/rspec-mocks/v/2-0/docs/stubs/stub-a-chain-of-methods#stub-a-chain- من بين الأساليب "يختلط =" نوفولو "> أو يرجى إلقاء نظرة على:
وعاشت rspecs !!! :)
واعتقد ان هذا هو في المواصفات تحكم؟
واقتراحكم الخاصة يجب أن تعمل بشكل جيد. والاحتمال الآخر هو لتحريك دعوة named_scope داخل النموذج الخاص بك، لتجنب هذه المسألة تماما. وهذا سيكون أيضا في خط مع "نماذج من الدهون، وحدات تحكم رقيقة" المشورة.
وأعتقد أنك قد فعلت الشيء تحكم رقيقة من خلال وضع الاستعلام في نطاق اسمه حيث يمكن إعادة استخدامها. وفيما يلي بعض التعليمات البرمجية اعتدت قبل أن بدأت باستخدام نطاقات اسمه.
def mock_comm(stubs={})
@mock_comm ||= mock_model(Comm, stubs)
end
describe "responding to GET index" do
it "should expose all comms as @comms" do
Comm.should_receive(:find).with(:all).and_return([mock_comm])
get :index
assigns[:comms].should == [mock_comm]
end
# ...
وأنا ربما كتابة التعليمات البرمجية يشبه إلى حد كبير ما كان لديك بالفعل، ولكن ربما وضعها في المساعد الذي يتيح لي الفرصة لإعادة استخدامها. والشيء الآخر هو استخدام الإطار ساخرا المختلفة التي ربما يمنحك المزيد من السيطرة. إلقاء نظرة على railscast ريان بيتس "على RSpec - انها قديمة بعض الشيء الآن ولكن لا تزال بعض الأفكار الجيدة في وجود
.