আরএসপেক: কোন পদ্ধতি বললে কীভাবে পরীক্ষা করবেন?


112

আরএসপেক টেস্টগুলি লেখার সময়, আমি নিজেকে অনেকগুলি কোড লিখতে দেখি যা এই পরীক্ষার বাস্তবায়নের সময় কোনও পদ্ধতি আহ্বান করা হয়েছিল তা নিশ্চিত করার জন্য (যুক্তি দেখানোর জন্য, আসুন কেবল বলে নেওয়া যাক আমি সত্যিই রাষ্ট্রটিকে জিজ্ঞাসাবাদ করতে পারি না কল করার পরে অবজেক্টটির কারণ পদ্ধতিটি সম্পাদন করে অপারেশনটির প্রভাবটি দেখা সহজ নয়)।

describe "#foo"
  it "should call 'bar' with appropriate arguments" do
    called_bar = false
    subject.stub(:bar).with("an argument I want") { called_bar = true }
    subject.foo
    expect(called_bar).to be_true
  end
end

আমি যা জানতে চাই তা হ'ল: এর চেয়েও ভাল কোনও সিন্টেক্স পাওয়া যায়? আমি কি কিছু মজাদার আরএসপেকের দুর্দান্ততা মিস করছি যা উপরের কোডটি কয়েক লাইনে কমিয়ে দেবে? should_receiveএটি করা উচিত বলে মনে হচ্ছে তবে আরও পড়ার মতো মনে হচ্ছে এটি ঠিক যা করে তা নয়।


3
: এখানে চেক করুন stackoverflow.com/questions/1328277/...
kddeisz

@ পিটার আলফভিন ওপি ওপরে সিনট্যাক্স চেয়েছিল should_receive, তাই আমি ভেবেছিলাম যে এই প্রশ্নটি সাহায্য করবে।
kddeisz

উত্তর:


141
it "should call 'bar' with appropriate arguments" do
  expect(subject).to receive(:bar).with("an argument I want")
  subject.foo
end

1
দুঃখিত, আমি বুঝতে পারছি না যে "টু .." (এই বার) এর এই ফর্ম্যাটটি উদাহরণ হিসাবে "ডাকা_বার" এর মান পরীক্ষা করে। আপনি কি আমাকে তা ব্যাখ্যা করতে পারেন?
ইকোডিং 5

2
@ ইকোডিং 5 নং এটি এবং না উভয় জন্য চেক করা উচিত called_bar। পদ্ধতিটি বলা হয়েছিল তা নিশ্চিত করার জন্য এটি কেবল একটি পতাকা ছিল, তবে expect(...).to receive(...)আপনি ইতিমধ্যে এটি আবরণ করছেন। এটি আরও পরিষ্কার এবং শব্দার্থক
wacko

@ ওয়াকো ওহো, এটি পেয়েছে, এটি পরিষ্কার করার জন্য ধন্যবাদ আমি প্রথম এটি ধরিনি।
ইকোডিং 5


37

নীচে কাজ করা উচিত

describe "#foo"
  it "should call 'bar' with appropriate arguments" do
     subject.stub(:bar)
     subject.foo
     expect(subject).to have_received(:bar).with("Invalid number of arguments")
  end
end

ডকুমেন্টেশন: https://github.com/rspec/rspec-mocks#expecting-arguments


আপনাকে ধন্যবাদ - আমি "NoMethodError" পেয়েছি? - ভাবুন যদিও এটি আরএসপেক ভার্সিনসগুলির সাথে করা উচিত। আমি আমার জন্য আরও একটি সমাধান খুঁজে পেয়েছি যা (উপরে একটি সঠিক হিসাবে চিহ্নিত হয়েছে)
মিকি হোগার্থ

@ মাইকি হোগার্থ এই উত্তরটি have_received(আসলে "গুপ্তচরদের" পদ্ধতির পরে) প্রস্তাব দিচ্ছিল has_received, যা আমি জানি আরএসপেকের কোনও সংস্করণের অংশ নয়।
পিটার আলফভিন

2

RSpec fully> 3.1 সিনট্যাক্স এবং rubocop-rspecনিয়মের জন্য ডিফল্ট বিকল্পটি সম্পূর্ণরূপে মেনে চলার জন্য RSpec/MessageSpiesআপনি এখানে যা করতে পারেন তা এখানে spy:

বার্তা প্রত্যাশা আপনি কোড-আন্ডার-টেস্ট শুরু করার আগে শুরুতে উদাহরণের প্রত্যাশা রাখে। অনেক বিকাশকারী কাঠামোগত কাঠামোগুলির জন্য একটি বিন্যাস-অ্যাক্ট-আসার্ট (বা দেওয়া-তখন-পরে) প্যাটার্ন ব্যবহার করতে পছন্দ করেন। স্পাইস হ'ল একটি বিকল্প ধরণের পরীক্ষার দ্বিগুণ যা এই ধরণটিকে সমর্থন করে যা আপনি প্রত্যাশা করে যে সত্যের পরে কোনও বার্তা পেয়েছে, হ'ল_প্রযুক্তি ব্যবহার করে।

# arrange.
invitation = spy('invitation')

# act.
invitation.deliver("foo@example.com")

# assert.
expect(invitation).to have_received(:deliver).with("foo@example.com")

আপনি যদি রুবোকপ-আরএসপেক বা অ-ডিফল্ট বিকল্প ব্যবহার না করেন। আপনি অবশ্যই প্রত্যাশা নিয়ে আরএসপেক 3 ডিফল্ট ব্যবহার করতে পারেন।

dbl = double("Some Collaborator")
expect(dbl).to receive(:foo).with("foo@example.com")
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.