Prophecy PHP: पूर्ण गाइड उदाहरणों के साथ

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Prophecy PHP: पूर्ण गाइड उदाहरणों के साथ

1. Prophecy क्या है और इसकी ज़रूरत क्यों है?

Prophecy PHP में मॉक ऑब्जेक्ट (mock-objects) बनाने के लिए एक शक्तिशाली ऑब्जेक्ट-ओरिएंटेड लाइब्रेरी है। यह टेस्ट स्टब्स, स्पाई और फर्जी ऑब्जेक्ट बनाने के लिए एक सुंदर, अभिव्यंजक और लचीला API प्रदान करता है, जो यूनिट टेस्ट में वास्तविक डिपेंडेंसी के व्यवहार की नकल करते हैं। कई अन्य लाइब्रेरी के विपरीत, Prophecy "भविष्यवाणी" (prophecy) पर ध्यान केंद्रित करता है — आप बताते हैं कि ऑब्जेक्ट को कैसे व्यवहार करना चाहिए, और लाइब्रेरी स्वचालित रूप से उसका कार्यान्वयन उत्पन्न करती है।

Prophecy का मुख्य उद्देश्य यूनिट टेस्ट लिखना जितना संभव हो सके उतना सरल और पढ़ने योग्य बनाना है। बजाय इसके कि आप मैन्युअल रूप से ढेर सारे कॉन्फ़िगरेशन के साथ जटिल मॉक-ऑब्जेक्ट बनाएं, आप बस किसी क्लास या इंटरफ़ेस के लिए "भविष्यवाणी घोषित" करते हैं, और फिर उन मेथड को कॉल करते हैं जिन्हें टेस्ट किए जा रहे कोड में कॉल किया जाना चाहिए। Prophecy स्वचालित रूप से जांचता है कि वास्तविक कॉल आपकी अपेक्षाओं से मेल खाते हैं या नहीं।

यह लाइब्रेरी विशेष रूप से उस कोड के परीक्षण में उपयोगी है जो बाहरी सेवाओं (डेटाबेस, API, फ़ाइल सिस्टम), जटिल ऑब्जेक्ट या साइड इफेक्ट वाले ऑब्जेक्ट पर निर्भर करता है। Prophecy आपको वास्तविक डिपेंडेंसी को अनुमानित स्टब्स से बदलकर टेस्ट किए जा रहे कोड को अलग करने की अनुमति देता है। यह Symfony और Laravel सहित कई PHP फ्रेमवर्क के लिए डी-फैक्टो मानक है, और Doctrine और PHPUnit (एकीकरण के माध्यम से) जैसी लोकप्रिय परियोजनाओं में उपयोग किया जाता है।

2. इंस्टॉलेशन (Installation)

Prophecy को Composer के माध्यम से इंस्टॉल किया जाता है — जो PHP के लिए मानक डिपेंडेंसी मैनेजर है। अपने प्रोजेक्ट की रूट डायरेक्टरी में निम्नलिखित कमांड चलाएँ:

composer require --dev phpspec/prophecy

फ्लैग --dev का मतलब है कि लाइब्रेरी केवल आपके composer.json के require-dev सेक्शन में जोड़ी जाएगी, क्योंकि Prophecy की ज़रूरत केवल टेस्टिंग के लिए है और इसे प्रोडक्शन एनवायरनमेंट में इस्तेमाल नहीं किया जाना चाहिए।

यदि आप PHPUnit का उपयोग कर रहे हैं, तो Prophecy के साथ स्वचालित रूप से काम करने के लिए इंटीग्रेशन पैकेज भी इंस्टॉल करने की सलाह दी जाती है:

composer require --dev phpspec/prophecy-phpunit

इंस्टॉलेशन के बाद, सुनिश्चित करें कि आपकी टेस्ट फ़ाइल में vendor/autoload.php फ़ाइल शामिल है (आमतौर पर PHPUnit में यह स्वचालित रूप से होता है)।

3. त्वरित शुरुआत — एक न्यूनतम काम करने वाला उदाहरण

आइए Prophecy का उपयोग करके एक सरल टेस्ट लिखें। मान लीजिए हमारे पास एक UserMailer क्लास है जो नए उपयोगकर्ता को स्वागत ईमेल भेजती है। यह MailerInterface इंटरफ़ेस पर निर्भर करता है।

<?php
// टेस्ट करने के लिए क्लासेज
interface MailerInterface {
    public function send(string $to, string $subject, string $body): bool;
}

class UserMailer {
    private $mailer;
    
    public function __construct(MailerInterface $mailer) {
        $this->mailer = $mailer;
    }
    
    public function sendWelcomeEmail(string $email): bool {
        return $this->mailer->send(
            $email,
            'Welcome!',
            'Thank you for joining!'
        );
    }
}

// Prophecy का उपयोग करके टेस्ट
use Prophecy\PhpUnit\ProphecyTrait;
use PHPUnit\Framework\TestCase;

class UserMailerTest extends TestCase {
    use ProphecyTrait;
    
    public function testSendWelcomeEmail() {
        // 1. MailerInterface के लिए भविष्यवाणी बनाएं
        $mailerProphecy = $this->prophesize(MailerInterface::class);
        
        // 2. अपेक्षा घोषित करें: send मेथड को विशिष्ट आर्गुमेंट के साथ एक बार कॉल किया जाएगा
        $mailerProphecy->send('user@example.com', 'Welcome!', 'Thank you for joining!')
            ->willReturn(true);
        
        // 3. भविष्यवाणी से मॉक-ऑब्जेक्ट प्राप्त करें
        $mailerMock = $mailerProphecy->reveal();
        
        // 4. UserMailer को मॉक के साथ इंस्टैंशिएट करें
        $userMailer = new UserMailer($mailerMock);
        
        // 5. टेस्ट करें
        $result = $userMailer->sendWelcomeEmail('user@example.com');
        
        // 6. परिणाम सत्यापित करें
        $this->assertTrue($result);
        
        // 7. Prophecy स्वचालित रूप से जांचता है कि सभी अपेक्षाएं पूरी हुईं
    }
}
?>

इस उदाहरण में, Prophecy ने MailerInterface के लिए एक मॉक ऑब्जेक्ट बनाया, यह सुनिश्चित किया कि send मेथड को सही आर्गुमेंट के साथ कॉल किया गया, और true लौटाया। अगर send मेथड को कॉल नहीं किया जाता या गलत आर्गुमेंट के साथ कॉल किया जाता, तो टेस्ट फेल हो जाता।

अनुशंसाएँ