سؤال

وأريد أن أدعو على 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 - انها قديمة بعض الشيء الآن ولكن لا تزال بعض الأفكار الجيدة في وجود

.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top