2011-06-14 13 views
18

मैंने mail रैपर वर्ग बनाया है। मुझे पता है कि ई-मेल भेजने के लिए कई पुस्तकालय हैं लेकिन मैं टीडीडी सीखना चाहता हूं ... इसलिए, मैंने कुछ परीक्षण किए हैं और मेरे पास कुछ कोड है। अब मैं कन्स्ट्रक्टर पर ईमेल पता सेट कर सकता हूं और इसे सत्यापित कर सकता हूं ... यदि ईमेल पता गलत है, तो अपवाद बढ़ता है। ईमेल पता केवल एक आवश्यक फ़ील्ड है ... मेरे पास सेट नहीं हैं और इसलिए हो जाता है क्योंकि उपयोगकर्ता कन्स्ट्रक्टर पर सभी ईमेल डेटा सेट करेगा।PHPUnit परीक्षण वास्तविक उदाहरण

अब, मैं प्रेषण परीक्षण लिखने जा रहा हूं। मुझे नहीं पता कि इसे कैसे शुरू किया जाए। यदि मैं सेटर्स और गेटर्स नहीं लेना चाहता हूं तो क्या मूल्य परीक्षण कर सकते हैं (विषय, मेल बॉडी, हेडर)? अगर कोई ईमेल भेजा जा सकता है तो मैं कैसे परीक्षण कर सकता हूं?

असली दुनिया टीडीडी उदाहरण मेरे लिए कठिन हैं। मैंने इसके बारे में जानने की कोशिश की है, मैंने बहुत सी चीजें पढ़ी हैं लेकिन मैं असली कोड का परीक्षण नहीं कर सकता।

धन्यवाद।

उत्तर

16

चूंकि आपने मेल फ़ंक्शन से लिंक किया है, इसलिए mail पर कॉल आपके कोड में हार्डकोड हो सकता है। तो

testhelper extension स्थापित करें पर एक नजर है और mail करने के लिए कॉल नकली। फिर नकली मान्य करें कि जब आपके रैपर की प्रेषण विधि कहा जाता है तो इसे सही मानों के साथ बुलाया जाता है, उदा। कहीं एक कस्टम मेल समारोह को परिभाषित:

function mail_mock() 
{ 
    $allThatWasPassedToTheFunction = func_get_args(); 
    return $allThatWasPassedToTheFunction; 
} 
अपने send() परीक्षा में

फिर, जैसे

public function testSendReceivesExpectedValues() 
{ 
    // replace hardcoded call to mail() with mock function 
    rename_function('mail', 'mail_orig'); 
    rename_function('mail_mock', 'mail'); 

    // use the wrapper 
    $testClass = new MailWrapper('[email protected]'); 
    $results = $testClass->send(); 

    // assert the result 
    $this->assertSame('[email protected]', $results[0]); 
    $this->assertSame('Default Title', $results[1]); 
    $this->assertSame('Default Message', $results[2]); 
} 

नोट कुछ है कि ऊपर मानती है कि आपके भेजने समारोह mail() कॉल का परिणाम वापस आ जाएगी है।

सामान्य रूप से, आप हमेशा बाह्य उपप्रणाली को प्रतिस्थापित करने का प्रयास करेंगे, जैसे प्रेषण या डेटाबेस या Mock or a Stub के साथ फाइल सिस्टम, ताकि आप बाह्य उपप्रणाली के अलगाव में अपने कोड का परीक्षण करने पर ध्यान केंद्रित कर सकें। आपको यह जांचने की आवश्यकता नहीं है कि mail वास्तव में काम करता है।

इसके अलावा http://www.phpunit.de/manual/3.6/en/test-doubles.html

2

एक शुद्ध इकाई परीक्षण में देखते हैं, क्या तुम सच में परीक्षण नहीं है एक असली ईमेल भेज दिया गया है कि क्या है, बल्कि क्या उचित प्रोग्रामिंग इकाई (इस मामले में mail समारोह) बुलाया गया है। मुझे वास्तव में यह नहीं पता कि कैसे परीक्षण किया जाए कि mail फ़ंक्शन वास्तव में काम करता है क्योंकि मुझे गहराई से ज्ञान नहीं है कि ईमेलिंग कैसे हुड के तहत काम करती है। तो, मैं बस लिखूंगा कि मैं यूनिट टेस्ट कैसे करूंगा।

आप अपने क्लास कन्स्ट्रक्टर को वैकल्पिक तर्क स्वीकार कर सकते हैं, एक ऐसा फ़ंक्शन जो वास्तव में ईमेल भेजने का असली काम करता है। डिफ़ॉल्ट रूप से, यह mail फ़ंक्शन होगा, लेकिन आपके परीक्षण सेटअप में, आप अपना विशेष कार्य प्रदान करेंगे जो वास्तव में सही विषय, शरीर और शीर्षलेख मौजूद हैं।

परीक्षण:

<?php 

class EmailerTest extends PHPUnit_Framework_TestCase 
{ 
    public function testMailFunctionIsCalledWithCorrectArguments() 
    { 
    $actualSubject, $actualBody, $actualHeaders; 
    $mailFunction = function ($subject, $body, $headers) 
     use (&$actualSubject, &$actualBody, &$actualHeaders) { 
     $actualSubject = $subject; 
     $actualBody = $body; 
     $actualHeaders = $headers; 
    }; 

    $emailer = new Emailer($options, $mailFunction); 
    $emailer->send(); 

    $this->assertEquals('Expected subject', $actualSubject); 
    $this->assertEquals('Expected body', $actualBody); 
    $this->assertEquals('Expected headers', $actualHeaders); 
    } 
} 

और परीक्षण के अंतर्गत वर्ग:

<?php 

class Emailer 
{ 
    public function __construct($options, $mailFunction = 'mail') 
    { 
    $this->subject = $options->subject; 
    $this->body = $options->body; 
    // etc. 
    $this->mailFunction = $mailFunction; 
    } 

    public function send() 
    { 
    // find out $subject, $body, $headers, and then... 

    call_user_func_array($this->mailFunction, array(
     $subject, 
     $body, 
     $headers 
    )); 
    } 
} 

यह छद्म कोड के कुछ प्रकार, आप को पूरा करने या लागू करने के लिए के लिए है क्योंकि मैं मूल्यों के कुछ छोड़ दिया गया है । मुख्य बिंदु यह है कि आपको उस कक्षा के सहयोगियों के लिए परीक्षण युगल की आपूर्ति करनी चाहिए, जिसका आप परीक्षण कर रहे हैं।

इस मामले में यह केवल एक फ़ंक्शन है (मैंने कुछ PHP 5.3 का उपयोग किया है) विशेषताएं, लेकिन यह एक ऑब्जेक्ट उदाहरण हो सकता है कि आप परीक्षण के तहत कक्षा में प्रवेश करेंगे।

0

मुझे लगता है कि कक्षा को ईमेल, विषय और अन्य जानकारी के लिए सत्यापन करना चाहिए, इसलिए मेरा सुझाव है कि इसे कार्यों में अलग किया जाना चाहिए।

जब आपके पास निजी सत्यापन फ़ंक्शन है जो विशिष्ट परिणाम लौटाएगा तो आप इसका परीक्षण करने के लिए दावा लिख ​​सकते हैं।

this article उपयोगी हो सकता है।

मैं भी टीडीडी के लिए बहुत नया हूं और मैं इस प्रक्रिया को समझने में मेरी सहायता के लिए आईडीई (नेटबीन्स) पर निर्भर होना चुनता हूं।

आशा है कि यह मदद :)

+1

नेटबीन ऐसा कैसे करते हैं? धन्यवाद। – thom

+0

इसमें PHPUnit सुविधा कोड-पूर्णता एकीकृत है जो PHPUnit परीक्षण फ़ंक्शंस सूचीबद्ध करती है। यह आपके लिए सभी काम नहीं करता है, यह केवल इसे आसान बनाने की सुविधा प्रदान करता है। इस आलेख को http://netbeans.org/kb/docs/php/phpunit.html आज़माएं – Panuwizzle

संबंधित मुद्दे