यूनिट परीक्षण लिखते समय, एक प्रमुख चुनौती यह सुनिश्चित करना है कि आपके परीक्षण बाहरी सिस्टम या निर्भरता के हस्तक्षेप के बिना परीक्षण के तहत कोड पर ध्यान केंद्रित करें। यह वह जगह है जहां नकली ऑब्जेक्ट PHPUnit में चलन में आते हैं। वे आपको नियंत्रित तरीके से वास्तविक वस्तुओं के व्यवहार का अनुकरण करने की अनुमति देते हैं, जिससे आपके परीक्षण अधिक विश्वसनीय और बनाए रखने में आसान हो जाते हैं। इस लेख में, हम पता लगाएंगे कि नकली वस्तुएं क्या हैं, वे उपयोगी क्यों हैं, और PHPUnit में उनका प्रभावी ढंग से उपयोग कैसे करें।
मॉक ऑब्जेक्ट्स वास्तविक ऑब्जेक्ट्स के सिम्युलेटेड संस्करण हैं यूनिट परीक्षण में उपयोग किए जाते हैं। वे आपको इसकी अनुमति देते हैं:
मॉक्स निम्नलिखित परिदृश्यों में विशेष रूप से उपयोगी होते हैं:
नकली वस्तुओं के साथ काम करते समय, आपको दो शब्द मिलेंगे: स्टबिंग और मॉकिंग:
PHPUnit createMock() विधि के साथ नकली ऑब्जेक्ट बनाना और उपयोग करना आसान बनाता है। नीचे कुछ उदाहरण दिए गए हैं जो प्रदर्शित करते हैं कि नकली वस्तुओं के साथ प्रभावी ढंग से कैसे काम किया जाए।
इस उदाहरण में, हम एक वर्ग निर्भरता के लिए एक नकली वस्तु बनाते हैं और उसके व्यवहार को निर्दिष्ट करते हैं।
use PHPUnit\Framework\TestCase; class MyTest extends TestCase { public function testMockExample() { // Create a mock for the SomeClass dependency $mock = $this->createMock(SomeClass::class); // Specify that when the someMethod method is called, it returns 'mocked value' $mock->method('someMethod') ->willReturn('mocked value'); // Pass the mock object to the class under test $unitUnderTest = new ClassUnderTest($mock); // Perform the action and assert that the result matches the expected value $result = $unitUnderTest->performAction(); $this->assertEquals('expected result', $result); } }
स्पष्टीकरण:
कभी-कभी, आपको यह सत्यापित करने की आवश्यकता होती है कि एक विधि को सही मापदंडों के साथ बुलाया गया है। यहां बताया गया है कि आप ऐसा कैसे कर सकते हैं:
public function testMethodCallVerification() { // Create a mock object $mock = $this->createMock(SomeClass::class); // Expect the someMethod to be called once with 'expected argument' $mock->expects($this->once()) ->method('someMethod') ->with($this->equalTo('expected argument')) ->willReturn('mocked value'); // Pass the mock to the class under test $unitUnderTest = new ClassUnderTest($mock); // Perform an action that calls the mock's method $unitUnderTest->performAction(); }
प्रमुख बिंदु:
नकली वस्तुओं के वास्तविक दुनिया के अनुप्रयोग को प्रदर्शित करने के लिए, आइए एक पेमेंटप्रोसेसर वर्ग का उदाहरण लें जो बाहरी पेमेंटगेटवे इंटरफ़ेस पर निर्भर करता है। हम पेमेंटगेटवे के वास्तविक कार्यान्वयन पर भरोसा किए बिना पेमेंटप्रोसेसर की प्रोसेसपेमेंट विधि का परीक्षण करना चाहते हैं।
यहां पेमेंटप्रोसेसर वर्ग है:
class PaymentProcessor { private $gateway; public function __construct(PaymentGateway $gateway) { $this->gateway = $gateway; } public function processPayment(float $amount): bool { return $this->gateway->charge($amount); } }
अब, हम वास्तविक भुगतान गेटवे के साथ इंटरैक्ट किए बिना प्रक्रिया भुगतान पद्धति का परीक्षण करने के लिए पेमेंटगेटवे के लिए एक मॉक बना सकते हैं।
use PHPUnit\Framework\TestCase; class PaymentProcessorTest extends TestCase { public function testProcessPayment() { // Create a mock object for the PaymentGateway interface $gatewayMock = $this->createMock(PaymentGateway::class); // Define the expected behavior of the mock $gatewayMock->method('charge') ->with(100.0) ->willReturn(true); // Inject the mock into the PaymentProcessor $paymentProcessor = new PaymentProcessor($gatewayMock); // Assert that processPayment returns true $this->assertTrue($paymentProcessor->processPayment(100.0)); } }
परीक्षण का विवरण:
आप यह भी सत्यापित कर सकते हैं कि भुगतान संसाधित करते समय चार्ज विधि को ठीक एक बार कॉल किया गया है:
public function testProcessPaymentCallsCharge() { $gatewayMock = $this->createMock(PaymentGateway::class); // Expect the charge method to be called once with the argument 100.0 $gatewayMock->expects($this->once()) ->method('charge') ->with(100.0) ->willReturn(true); $paymentProcessor = new PaymentProcessor($gatewayMock); $paymentProcessor->processPayment(100.0); }
इस उदाहरण में, एक्सपेक्ट्स($this->ones()) यह सुनिश्चित करता है कि चार्ज विधि को ठीक एक बार कॉल किया जाए। यदि विधि को कॉल नहीं किया जाता है, या एक से अधिक बार कॉल किया जाता है, तो परीक्षण विफल हो जाएगा।
मान लें कि आपके पास एक UserService वर्ग है जो उपयोगकर्ता डेटा लाने के लिए UserRepository पर निर्भर करता है। UserService को अलग से परखने के लिए, आप UserRepository का नकल कर सकते हैं।
class UserService { private $repository; public function __construct(UserRepository $repository) { $this->repository = $repository; } public function getUserName($id) { $user = $this->repository->find($id); return $user->name; } }
इस वर्ग का परीक्षण करने के लिए, हम भंडार का नकल कर सकते हैं:
use PHPUnit\Framework\TestCase; class UserServiceTest extends TestCase { public function testGetUserName() { // Create a mock for the UserRepository $mockRepo = $this->createMock(UserRepository::class); // Define that the find method should return a user object with a predefined name $mockRepo->method('find') ->willReturn((object) ['name' => 'John Doe']); // Instantiate the UserService with the mock repository $service = new UserService($mockRepo); // Assert that the getUserName method returns 'John Doe' $this->assertEquals('John Doe', $service->getUserName(1)); } }
PHPUnit में यूनिट परीक्षण लिखने के लिए मॉक ऑब्जेक्ट अमूल्य उपकरण हैं। वे आपको अपने कोड को बाहरी निर्भरता से अलग करने की अनुमति देते हैं, जिससे यह सुनिश्चित होता है कि आपके परीक्षण तेज़, अधिक विश्वसनीय और बनाए रखने में आसान हैं। मॉक ऑब्जेक्ट परीक्षण के तहत कोड और उसकी निर्भरता के बीच इंटरैक्शन को सत्यापित करने में भी मदद करते हैं, यह सुनिश्चित करते हुए कि आपका कोड विभिन्न परिदृश्यों में सही ढंग से व्यवहार करता है
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3