এটি স্ট্যাটিকালি টাইপের পরিবর্তে গতিশীল হবে । হাঁসের টাইপিং একইভাবে কাজ করবে যা ইন্টারফেসগুলি স্ট্যাটিকালি টাইপ করা ভাষায় করে। এছাড়াও, এর ক্লাসগুলি রানটাইমের সময় সংশোধনযোগ্য হবে যাতে কোনও পরীক্ষার কাঠামো সহজেই বিদ্যমান ক্লাসগুলিতে ঝাঁকুনি বা উপহাসের পদ্ধতিগুলি তৈরি করতে পারে। রুবি এমন একটি ভাষা; আরএসপেক টিডিডি-র জন্য এটির পরীক্ষামূলক কাঠামো।
কীভাবে গতিশীল টাইপিং এইডস টেস্টিং
ডায়নামিক টাইপিংয়ের মাধ্যমে আপনি মক অবজেক্টগুলি কেবল এমন ক্লাস তৈরি করে তৈরি করতে পারেন যা আপনার অনুরূপ উপায়ে করা উচিত এমন সহযোগী অবজেক্টের একই ইন্টারফেস (পদ্ধতি স্বাক্ষর) রয়েছে। উদাহরণস্বরূপ, ধরুন আপনার কাছে এমন কোনও শ্রেণি রয়েছে যা বার্তা পাঠিয়েছিল:
class MessageSender
def send
# Do something with a side effect
end
end
ধরা যাক যে আমাদের একটি মেসেজসেন্ডার ব্যবহারকারী রয়েছে যা মেসেজসেন্ডারের উদাহরণ ব্যবহার করে:
class MessageSenderUser
def initialize(message_sender)
@message_sender = message_sender
end
def do_stuff
...
@message_sender.send
...
@message_sender.send
...
end
end
নির্ভরতা ইনজেকশন , ইউনিট পরীক্ষার প্রধানতম এখানে ব্যবহার নোট করুন । আমরা ফিরে আসব।
আপনি MessageSenderUser#do_stuff
কল করতে চান যে কল দুটি বার প্রেরণ। আপনি যেমন স্ট্যাটিকালি টাইপ করা ভাষায় চান তেমনই আপনি একটি মক ম্যাসেজসেন্ডার তৈরি করতে পারেন যা কতবার কল করা send
হয়েছিল তা গণনা করে । তবে স্ট্যাটিকালি টাইপ করা ভাষার মতো নয়, আপনার কোনও ইন্টারফেস ক্লাসের দরকার নেই। আপনি কেবল এগিয়ে যান এবং এটি তৈরি করুন:
class MockMessageSender
attr_accessor :send_count
def initialize
@send_count = 0
end
def send
@send_count += 1
end
end
এবং এটি আপনার পরীক্ষায় ব্যবহার করুন:
mock_sender = MockMessageSender.new
MessageSenderUser.new(mock_sender).do_stuff
assert_equal(mock_sender.send_count, 2)
নিজেই, একটি গতিময়ভাবে টাইপিত ভাষার "হাঁসের টাইপিং" কোনও স্ট্যাটিকালি টাইপ করা ভাষার তুলনায় পরীক্ষার সাথে তেমন যোগ করে না। তবে কী যদি ক্লাসগুলি বন্ধ না করা হয় তবে রানটাইমে সংশোধন করা যায়? এটি একটি গেম চেঞ্জার। আসুন দেখুন কিভাবে।
শ্রেণি পরীক্ষার যোগ্য করতে যদি আপনার নির্ভরতা ইনজেকশন ব্যবহার না করে তবে কী হবে?
মনে করুন যে মেসেজসেন্ডার ব্যবহারকারী কেবল কখনও বার্তা প্রেরণের জন্য মেসেজসেন্ডার ব্যবহার করবে এবং আপনার অন্য কোনও শ্রেণীর সাথে মেসেজসেন্ডারের প্রতিস্থাপনের অনুমতি দেওয়ার দরকার নেই। একটি প্রোগ্রামের মধ্যে এটি প্রায়শই ঘটে। আসুন মেসেজসেন্ডার ব্যবহারকারীকে আবার লিখি যাতে এটি কোনও নির্ভরতা ইঞ্জেকশন ছাড়াই কেবল একটি বার্তা সেন্ডার তৈরি করে এবং ব্যবহার করে।
class MessageSenderUser
def initialize
@message_sender = MessageSender.new
end
def do_stuff
...
@message_sender.send
...
@message_sender.send
...
end
end
ম্যাসেজসেন্ডার ব্যবহারকারী এখন ব্যবহার করা সহজ: এটি তৈরির জন্য যে কেউই এটির ব্যবহারের জন্য একটি ম্যাসেজসেন্ডার তৈরি করার প্রয়োজন হয় না। এটি এই সাধারণ উদাহরণে কোনও বৃহত উন্নতির মতো বলে মনে হচ্ছে না তবে এখন ভাবুন যে মেসেজসেন্ডার ব্যবহারকারী একাধিক স্থানে তৈরি হয়েছে, বা এর তিনটি নির্ভরতা রয়েছে। এখন ইউনিট পরীক্ষাগুলি সুখী করার জন্য সিস্টেমে পুরোপুরি প্রচুর দৃষ্টান্ত রয়েছে, কারণ এটি অগত্যা নকশাকে একেবারে উন্নত করে না।
ওপেন ক্লাস আপনাকে নির্ভরতা ইনজেকশন ছাড়াই পরীক্ষা করতে দেয়
গতিশীল টাইপিং এবং ওপেন ক্লাসগুলির সাথে একটি ভাষার পরীক্ষার কাঠামো টিডিডিটিকে বেশ সুন্দর করে তুলতে পারে। ম্যাসেজসেন্ডার ব্যবহারকারীদের জন্য একটি আরএসপেক পরীক্ষার কোড স্নিপেট এখানে রয়েছে:
mock_message_sender = mock MessageSender
MessageSender.should_receive(:new).and_return(mock_message_sender)
mock_message_sender.should_receive(:send).twice.with(no_arguments)
MessageSenderUser.new.do_stuff
এটাই পুরো পরীক্ষা। যদি ঠিক দু'বার MessageSenderUser#do_stuff
প্রার্থনা না করে তবে MessageSender#send
এই পরীক্ষাটি ব্যর্থ হয়। আসল মেসেজসেন্ডার শ্রেণি কখনই আহবান করা হয় না: আমরা পরীক্ষাটি বলেছি যে যখনই কেউ ম্যাসেজসেন্ডার তৈরি করার চেষ্টা করবেন, তাদের পরিবর্তে আমাদের মক ম্যাসেজসেন্ডারটি পাওয়া উচিত। কোন নির্ভরতা ইনজেকশন প্রয়োজন।
এ জাতীয় সরল পরীক্ষায় এত কিছু করা ভাল। নির্ভরতা ইনজেকশনটি ব্যবহার না করা আপনার পক্ষে কখনই সুন্দর না যদি না এটি আপনার নকশার জন্য বাস্তবে বোঝায় না।
তবে এটি উন্মুক্ত ক্লাসগুলির সাথে কী করার আছে? কলটি নোট করুন MessageSender.should_receive
। আমরা মেসেজসেন্ডারটি লিখতে গিয়ে # শোল্ড_আরসিভের সংজ্ঞা দিইনি, তাহলে কে করেছে? উত্তরটি হ'ল পরীক্ষার কাঠামোটি, সিস্টেম ক্লাসে কিছু সাবধানে পরিবর্তন করে, এটি প্রদর্শিত করতে সক্ষম হয় যেমন # শোল_প্রেরণ প্রতিটি বস্তুর উপর সংজ্ঞায়িত হয়। আপনি যদি ভাবেন যে এর মতো সিস্টেম ক্লাসগুলি সংশোধন করতে কিছুটা সতর্কতা প্রয়োজন, আপনি ঠিক বলেছেন। তবে এটি পরীক্ষার পাঠাগারটি এখানে কী করছে তার জন্য নিখুঁত জিনিস এবং উন্মুক্ত ক্লাসগুলি এটি সম্ভব করে তোলে।