লারাভেল (Laravel) একটি শক্তিশালী PHP ফ্রেমওয়ার্ক যা ডেভেলপারদের অ্যাপ্লিকেশন টেস্টিং করার জন্য উন্নত টুলস এবং ফিচার সরবরাহ করে। এর মধ্যে একটি গুরুত্বপূর্ণ টেস্টিং টেকনিক হল মকিং (Mocking)। মকিং হলো একটি টেস্টিং কৌশল যেখানে আপনি নির্দিষ্ট ডিপেনডেন্সি বা ক্লাসের আসল কার্যকলাপের পরিবর্তে একটি মক অবজেক্ট বা মক ফাংশন ব্যবহার করেন। এটি মূলত টেস্টিংকে আরও নির্দিষ্ট এবং দ্রুত করার জন্য ব্যবহৃত হয়, যেখানে আসল ডিপেনডেন্সি বা সিস্টেমের প্রভাব এড়ানো হয়।
মকিং (Mocking) একটি টেস্টিং কৌশল যা ব্যবহার করে আপনি একটি মক অবজেক্ট তৈরি করেন যা একটি আসল অবজেক্টের আচরণ নকল করে। এটি সাহায্য করে যখন আপনি কোনো বিশেষ ফাংশন বা ক্লাসের আচরণ পরীক্ষা করতে চান, কিন্তু সেই ফাংশন বা ক্লাসের আসল কার্যকারিতা চালাতে চান না। এর ফলে টেস্টিং আরো দ্রুত হয় এবং নির্দিষ্ট অংশগুলোর উপর মনোযোগ দিতে সহজ হয়।
লারাভেল মকিংয়ের জন্য Mockery
প্যাকেজ ব্যবহার করে থাকে, যা লারাভেলের টেস্টিং ফিচারের সাথে একত্রে কাজ করে। লারাভেল ডিফল্টভাবে Mockery
ইন্টিগ্রেটেডভাবে প্রদান করে, যাতে আপনি সহজেই মক অবজেক্ট তৈরি এবং ব্যবহার করতে পারেন।
লাটাভেলে মকিং ব্যবহার করার জন্য Mockery
ক্লাসের mock()
মেথড ব্যবহার করা হয়। এখানে কিছু উদাহরণ দেওয়া হলো:
ধরা যাক, আপনার একটি UserService
ক্লাস রয়েছে যেটি একটি UserRepository
ক্লাসের উপর নির্ভরশীল। আপনি চাইলে UserRepository
ক্লাসটি মক করে টেস্ট করতে পারেন, যাতে আসল ডাটাবেস কনফিগারেশন বা ডেটা প্রয়োজন না হয়।
use Mockery;
use App\Services\UserService;
use App\Repositories\UserRepository;
public function testUserService()
{
// মক অবজেক্ট তৈরি
$mockRepository = Mockery::mock(UserRepository::class);
// মক অবজেক্টে প্রত্যাশিত আচরণ নির্ধারণ
$mockRepository->shouldReceive('getUser')->with(1)->andReturn('John Doe');
// সার্ভিস ক্লাসে মক অবজেক্ট ইনজেক্ট করা
$service = new UserService($mockRepository);
// টেস্ট করা
$result = $service->getUser(1);
$this->assertEquals('John Doe', $result);
}
এখানে, আমরা UserRepository
ক্লাসের মক অবজেক্ট তৈরি করেছি এবং তার getUser()
মেথডের জন্য প্রত্যাশিত আউটপুট নির্ধারণ করেছি। তারপর, এই মক অবজেক্টটি UserService
ক্লাসে ইনজেক্ট করেছি এবং টেস্ট করেছি।
shouldReceive()
মেথড ব্যবহার করে আপনি মক অবজেক্টের জন্য নির্দিষ্ট মেথড এবং তাদের প্রত্যাশিত আউটপুট সেট করতে পারেন। উদাহরণ:
$mock = Mockery::mock('ClassName');
$mock->shouldReceive('methodName')
->once() // মেথডটি একবার কল হবে
->with('argument') // নির্দিষ্ট আর্গুমেন্ট দিয়ে
->andReturn('result'); // প্রত্যাশিত রেজাল্ট
এখানে, methodName
হল সেই মেথড যা আপনি মক করতে চান, এবং andReturn()
দ্বারা আপনি যে ফলাফল আশা করছেন তা নির্ধারণ করবেন।
লাটাভেলে, আপনি যদি মক অবজেক্টে কোনো মেথড কল না করে থাকেন, তবে mockery
এর never()
ফাংশন ব্যবহার করতে পারেন:
$mock->shouldReceive('methodName')
->never(); // এই মেথডটি কখনোই কল হবে না
এটি নিশ্চিত করে যে মক অবজেক্টে ওই মেথডটি কখনো কল হবে না।
আপনি যখন মক অবজেক্ট তৈরি করেন, তখন তা অ্যাসার্ট (assert) করার মাধ্যমে নিশ্চিত করতে পারেন যে প্রত্যাশিত মেথডগুলি সঠিকভাবে কল হয়েছে।
$mock->shouldReceive('methodName')
->once()
->andReturn('someValue');
// টেস্ট শেষে মক অবজেক্টের প্রত্যাশিত মেথড কল হয়েছে কি না তা পরীক্ষা
$mock->shouldHaveReceived('methodName')->once();
এটি নিশ্চিত করবে যে মক অবজেক্টের methodName
মেথডটি একবার কল হয়েছে।
লারাভেলে, মক অবজেক্ট ব্যবহার করার পর Mockery::close()
ফাংশনটি কল করে ক্লিনআপ করতে হয়।
public function tearDown(): void
{
Mockery::close();
}
এটি নিশ্চিত করবে যে সমস্ত মক অবজেক্ট সঠিকভাবে ক্লিনআপ হয়েছে এবং পরবর্তী টেস্টে কোনো সমস্যা হবে না।
লারাভেল মকিং (Mocking) একটি শক্তিশালী টেস্টিং কৌশল যা আপনাকে নির্দিষ্ট ডিপেনডেন্সি বা ক্লাসের আচরণকে নকল করে টেস্টিং করতে সাহায্য করে। এটি টেস্টিং প্রক্রিয়াকে দ্রুত এবং নির্দিষ্ট করে তোলে, যেখানে আপনি আসল কার্যকলাপের পরিবর্তে মক অবজেক্ট ব্যবহার করতে পারেন। মকিংয়ের মাধ্যমে ডিপেনডেন্সি ইনজেকশন এবং সার্ভিস ক্লাসগুলোর সঠিক কাজের পরীক্ষা করা সহজ হয়, এবং আপনি কোডের নির্দিষ্ট অংশগুলোকে আলাদা করে টেস্ট করতে পারেন।
Read more