কম্পিউটার

কিভাবে RSpec Mocks ব্যবহার করবেন (ধাপে ধাপে টিউটোরিয়াল)

RSpec এ মক কি?

(বা সাধারণভাবে একটি উপহাস, কারণ এটি RSpec-এর জন্য অনন্য একটি ধারণা নয়।)

একটি উপহাস পরীক্ষার জন্য ব্যবহৃত একটি বস্তু .

আপনি দুটি বস্তুর মধ্যে মিথস্ক্রিয়া পরীক্ষা করার জন্য উপহাস ব্যবহার করুন। আউটপুট মান পরীক্ষা করার পরিবর্তে, নিয়মিত প্রত্যাশার মতো।

উদাহরণস্বরূপ :

আপনি একটি এপিআই লিখছেন যা চিত্রগুলিকে ফ্লিপ করে৷

আপনার নিজের ইমেজ ম্যানিপুলেশন কোড লেখার পরিবর্তে আপনি mini_magick এর মত একটি রত্ন ব্যবহার করেন .

আপনি আপনার কোড এবং এই বাহ্যিক নির্ভরতা এর মধ্যে মিথস্ক্রিয়া পরীক্ষা করতে চান … তাই আপনি একটি উপহাস লেখেন যা আশা করে যে সঠিক পদ্ধতিগুলি ImageProcessor-এ কল করা হবে ক্লাস।

এর মানে হল যে আপনি প্রতিবার পরীক্ষা চালানোর সময় ছবিগুলি (একটি ধীর অপারেশন) ফ্লিপ করবেন না৷

এটা কিভাবে কাজ করে?

মকগুলি আসল বস্তুটিকে প্রতিস্থাপন করে, তাই আসল পদ্ধতিগুলি বলা হবে না৷

কিছু কোড উদাহরণের জন্য সময়!

RSpec মক উদাহরণ

এখানে ImageFlipper পরীক্ষা:

RSpec.describe "ImageFlipper" do it "সঠিক আর্গুমেন্ট সহ ফ্লিপ পদ্ধতিকে কল করে" do mock =double("mini_magick") আশা (mock).to receive(:flip).with("ruby.jpg") img =ImageFlipper.new(মক) img.flip("ruby.jpg") endend

এই পরীক্ষার মাধ্যমে আমরা TDD ব্যবহার করে আমাদের কোড লিখতে পারি।

প্রথম :

আমাদের একটি ImageFlipper লিখতে হবে ক্লাস।

এরকম :

class ImageFlipper def initialize(image_processor) @image_processor =image_processor endend

এছাড়াও আমাদের একটি flip প্রয়োজন পদ্ধতি:

def flip(file_name)end

এখন আমরা RSpec:

থেকে এই প্রতিক্রিয়া পাই
ব্যর্থতা:1) ImageFlipper সঠিক আর্গুমেন্ট সহ ফ্লিপ পদ্ধতিকে কল করে ব্যর্থতা/ত্রুটি:expect(mock).to receive(:flip).with("ruby.jpg") (ডাবল "mini_magick").flip(" ruby.jpg") প্রত্যাশিত:আর্গুমেন্ট সহ 1 বার:("ruby.jpg") প্রাপ্তি:0 বার # ./rspec-mocks.rb:6:in `block (2 স্তর) in ' 

এটা বলছে যে flip পদ্ধতিটি 0 বার কল করা হয়েছিল, কিন্তু এটি 1 বার বলা হবে বলে আশা করা হয়েছিল৷

আপনি এটি যা চান তা দিয়ে এই পরীক্ষাটি পাস করতে পারেন :

def flip(file_name) @image_processor.flip(file_name)end

এবং আপনি সেখানে যান, আমাদের একটি পাশ পরীক্ষা আছে :

.0.00751 সেকেন্ডে শেষ (ফাইলগুলি লোড হতে 0.11157 সেকেন্ড সময় নেয়) 1 উদাহরণ, 0 ব্যর্থতা

আসুন পর্যালোচনা করা যাক:আমরা এখানে কি করেছি?

আমরা একটি ImageFlipper তৈরি করেছি ক্লাস যা একটি image_processor নেয় .

এই প্রসেসর flip-এ সাড়া দেয় পদ্ধতি।

এই পদ্ধতিটি একবার বলা হয়েছিল কিনা তা পরীক্ষা করার জন্য আমরা একটি মক ব্যবহার করি, একটি যুক্তি সহ৷

আমি জানি।

এই উদাহরণটি সহজ।

কিন্তু আপনি ImageFlipper এর সম্পূর্ণ বাস্তবায়ন কল্পনা করতে পারেন এটি পরীক্ষা করে যে ফাইলটি বিদ্যমান কিনা, এটি একটি বৈধ ছবি কিনা ইত্যাদি।

মক এবং ভ্যালু টেস্টিং এর মধ্যে পার্থক্য

একটি নিয়মিত পরীক্ষায় আপনি একটি পদ্ধতির রিটার্ন মান চেক করুন :

"এই পদ্ধতিটি কি একটি উল্টানো চিত্র ফিরিয়ে দিয়েছে?"

একটি উপহাস ব্যবহার করার সময় আপনি আচরণ পরীক্ষা করছেন :

“আমরা কি অন্যদের সঠিক তথ্য দিয়ে সঠিক জিনিসটি করতে বলেছি এবং আমাদের প্রয়োজনের সঠিক পরিমাণে বলেছি?”

মক বনাম স্টাবস

আরেকটি বিভ্রান্তির বিষয় হল উপহাস এবং স্টাব তুলনা করা।

পার্থক্য কি?

  • একটি স্টাব শুধুমাত্র একটি টিনজাত প্রতিক্রিয়া সহ একটি পদ্ধতি, এটি আচরণের দিকে খেয়াল রাখে না।
  • একটি উপহাস পদ্ধতিগুলিকে ডাকা হবে বলে আশা করে, যদি সেগুলিকে ডাকা না হয় তবে পরীক্ষা ব্যর্থ হবে৷

আরএসপেক-এ এখানে একটি স্টাব আছে :

stub =দ্বিগুণ("json")অনুমতি (stub) পেতে(:response) করতে {"blog"=>"rubyguides.com", "rating"=>"5/5"}.to_jsonend

allow পদ্ধতিই এটিকে অসম্পূর্ণ করে তোলে।

আমরা আমাদের টেস্টিং অবজেক্ট double("json") এর অনুমতি দিচ্ছি এই পদ্ধতিটি গ্রহণ করতে এবং প্রতিক্রিয়া জানাতে, কিন্তু আমরা এটিকে ডাকা হচ্ছে কিনা তা পরীক্ষা করছি না .

এটাই পার্থক্য!

ভেরিফাইড ডাবল কিভাবে ব্যবহার করবেন

উপহাস এবং স্টাবগুলির একটি খারাপ দিক হল আপনি এমন একটি পদ্ধতি ব্যবহার করে শেষ করতে পারেন যা আপনার প্রোডাকশন কোডে বিদ্যমান নেই৷

কারণ পদ্ধতির নাম পরিবর্তিত হয়েছে… অথবা হয়ত আপনি একটি টাইপো করেছেন!

যাচাইকৃত দ্বিগুণ এর সাথে দেখা করুন .

একটি যাচাইকৃত ডবল হয় একটি স্টাব হিসাবে ব্যবহার করা যেতে পারে (allow ) অথবা একটি উপহাস (expect ) এবং এটি পরীক্ষা করবে যে এই নামের একটি পদ্ধতি বিদ্যমান।

উদাহরণ :

মক =instance_double(ImageProcessor)

পদ্ধতিটি বিদ্যমান না থাকলে এটি একটি ত্রুটি উত্থাপন করবে:

1) ImageFlipper সঠিক আর্গুমেন্ট সহ ফ্লিপ পদ্ধতিকে কল করে ব্যর্থতা/ত্রুটি:expect(mock).to receive(:flip).with("ruby.jpg") ImageProcessor ক্লাস ইনস্ট্যান্স পদ্ধতি বাস্তবায়ন করে না:flip 

কিন্তু পদ্ধতিটি বিদ্যমান থাকলে এটি সঠিকভাবে কাজ করবে।

মক রিটার্নিং ভ্যালু

আসুন উপহাস করতে ফিরে যাই।

শেষ উদাহরণে আমাদের এটি ছিল:

প্রত্যাশিত(মক) প্রাপ্তির(:flip).with("ruby.jpg")

যখন আপনার কোড flip কল করে , মক nil ফিরে আসবে .

যদি কোডটি শূন্য ছাড়া অন্য কিছু মান আশা করে তবে এটি একটি ত্রুটির কারণ হবে৷

আপনি মক রিটার্নের ফলাফল তৈরি করে এটি ঠিক করতে পারেন।

এরকম :

প্রত্যাশিত(মক) প্রাপ্তির(:flip).with("ruby.jpg").and_return("ruby-flipped.jpg") 

উদাহরণ পদ্ধতিগুলি কীভাবে উপহাস করবেন

ধরা যাক যে আপনার কাছে এইরকম কোড আছে:

ক্লাস নম্বর জেনারেটর ডিফ র্যান্ডম "A" * র‍্যান্ড(1..10) শেষ হয়

এলোমেলোতার কারণে এই পদ্ধতিটি পরীক্ষা করা কঠিন।

RSpec আপনাকে rand উপহাস করতে বা স্টাব করার অনুমতি দেয় .

এরকম :

এটি "একটি এলোমেলো সংখ্যা তৈরি করে" ডু generator =NumberGenerator.new অনুমতি দেয়(generator).receive(:rand).and_return(5) expect(generator.random).to eq("AAAAA")এন্ড

এখন :

rand একটি নির্দিষ্ট মান প্রদান করে যাতে আপনি এটি আপনার পদ্ধতির ফলাফল পরীক্ষা করার জন্য ব্যবহার করতে পারেন।

আদর্শভাবে, আপনি আপনার নির্ভরতা ইনজেক্ট করতে চান (rand ফাংশন, এই ক্ষেত্রে) যাতে আপনি এটি নিয়ন্ত্রণ করতে পারেন। একটি নির্ভরতা ইনজেক্ট করার অর্থ হল আপনি এটিকে একটি প্যারামিটার হিসাবে পাস করুন৷ , অভিনব কিছু নয়।

কিন্তু কখনও কখনও শুধুমাত্র পদ্ধতিটি বাদ দেওয়া আরও সুবিধাজনক।

কখন মক ব্যবহার করবেন?

এখন বড় প্রশ্নের জন্য…

ঠিক কখন আপনার মক ব্যবহার করা উচিত?

সফটওয়্যার ডেভেলপমেন্ট একটি জটিল বিষয়।

কিন্তু কিছু ​​নির্দেশিকা আছে যা আপনি অনুসরণ করতে পারেন৷ :

  1. যদি পরীক্ষার অধীনে পদ্ধতিটি একটি মান প্রদান করে এবং এর কোনো পার্শ্বপ্রতিক্রিয়া না থাকে (ফাইল তৈরি করা, API অনুরোধ করা ইত্যাদি) তাহলে আপনার উপহাসের প্রয়োজন নেই। শুধু রিটার্ন মান পরীক্ষা করুন।
  2. যদি পদ্ধতিটি বাহ্যিক বস্তুর সাথে কাজ করে এবং তাদের কাছে আদেশ পাঠায়, তাহলে আপনি এই বস্তুর সাথে মিথস্ক্রিয়াকে উপহাস করতে পারেন।
  3. যদি পদ্ধতিটি একটি বহিরাগত পরিষেবা (যেমন একটি API) থেকে ডেটা অনুরোধ করে, তাহলে আপনি পরীক্ষার উদ্দেশ্যে এই ডেটা সরবরাহ করতে একটি স্টাব ব্যবহার করতে পারেন৷

আপনি বাহ্যিক বিশ্বের সাথে ইন্টারঅ্যাকশনের জন্য উপহাস সংরক্ষণ করতে চান .

অন্য কথায়…

আপনার নিজের অ্যাপ্লিকেশনের ক্লাসকে উপহাস করা এড়িয়ে চলুন!

কেন?

কারণ এটি বাস্তবায়নের বিশদগুলির সাথে আপনার পরীক্ষাগুলিকে সংযুক্ত করার প্রচার করে এবং এটি আপনার কোড পরিবর্তন করা কঠিন করে তোলে .

একমাত্র ব্যতিক্রম হল সেই ক্লাসগুলির জন্য যা 3য় পক্ষের কোডের জন্য মোড়ক৷

আরো জানতে এই ভিডিওটি দেখুন :

সারাংশ

আপনি RSpec মক, স্টাব এবং যাচাইকৃত ডাবল সম্পর্কে শিখেছেন!

অনুগ্রহ করে এই নিবন্ধটি শেয়ার করুন যাতে আরও বেশি লোক এই বিষয়বস্তু উপভোগ করতে এবং উপকৃত হতে পারে৷

পড়ার জন্য ধন্যবাদ 🙂


  1. রুবি এনি, অল, নন এবং ওয়ান কিভাবে ব্যবহার করবেন

  2. রুবি গ্রেপ পদ্ধতি কীভাবে ব্যবহার করবেন (উদাহরণ সহ)

  3. রুবি মানচিত্র পদ্ধতি কীভাবে ব্যবহার করবেন (উদাহরণ সহ)

  4. রুবি থ্রেডগুলি কীভাবে ব্যবহার করবেন:টিউটোরিয়াল বোঝার জন্য সহজ