2011-12-05 11 views
6

मैं एक परियोजना में एक परीक्षण ढांचे को शामिल करना चाहता हूं जो मैं बना रहा हूं और Enhance PHP पर आया जो मुझे पसंद है लेकिन मुझे "PHP बढ़ाने" के बाद से ऑनलाइन प्रासंगिक जानकारी खोजने में कुछ कठिनाई हो रही है एक सामान्य रूप से इस्तेमाल किया वाक्यांश।"एन्हांस पीएचपी" के साथ शुरू करना

क्या कोई इस ढांचे के साथ काम करता है जो मुझे कुछ सहायक मार्गदर्शिका की ओर इंगित करने में सक्षम हो सकता है? क्या आपने यूनिट टेस्ट फ्रेमवर्क के साथ काम किया है जो आपको लगता है कि आश्चर्यजनक रूप से बेहतर है?

अग्रिम धन्यवाद।

Gotzofter के जवाब में, इस वर्ग का परीक्षण किया जा रहा है: ExampleClass के लिए मेरे निर्माता पर

<?php 
include_once('EnhanceTestFramework.php'); 

class ExampleClass 
{ 
    private $OtherClass; 

    function __construct($mock = null) 
    { 
     if ($mock == null) 
      $this->OtherClass = new OtherExampleClass(); 
     else 
      $this->OtherClass = $mock; 
    } 

    public function doSomething() 
    { 
     return $this->OtherClass->getSomething(1, 'Arg2'); 
    } 
} 

class OtherExampleClass 
{ 
    public function getSomething() 
    { 
     return "Something"; 
    } 
} 

class ExampleClassTests extends \Enhance\TestFixture 
{ 
    public function setUp() 
    { 
    } 

    public function tearDown() 
    { 
    } 

    public function verifyWithAMock() 
    { 
     $mock = \Enhance\MockFactory::createMock('OtherExampleClass'); 
     $mock->addExpectation(
      \Enhance\Expect::method('getSomething') 
       ->with(1, 'Arg2') 
       ->returns('Something') 
       ->times(1) 
      ); 
     $target = new ExampleClass($mock); 
     $result = $target->doSomething(); 
     \Enhance\Assert::areIdentical("Something", $result); 

     $mock->verifyExpectations(); 
    } 
} 

\Enhance\Core::runTests(); 

देखो।

क्योंकि एनएनजी-पीएचपी साइट उदाहरण नए उदाहरण क्लास ($ नकली) को कॉल करके $ मॉक ऑब्जेक्ट इंजेक्ट करता है, इसलिए मुझे इनपुट मापदंड के रूप में $ mock को संभालने के लिए अपना उदाहरण क्लास कन्स्ट्रक्टर बदलने के लिए मजबूर होना पड़ता है।

क्या मुझे इसे उन सभी वर्गों के लिए संभालना है जिन्हें मैं ढांचे के साथ इकाई परीक्षण के अधीन रखना चाहता हूं?

धन्यवाद।

+1

[enh-php.com] (http://www.enhance-php.com) में एक [त्वरित प्रारंभ मार्गदर्शिका] है (http://www.enhance-php.com/Content/Quick-Start-Guide /) और ऐसा लगता है कि उनके पास [सभी प्रमुख विशेषताओं पर सभ्य दस्तावेज] है (http://www.enhance-php.com/Content/Documentation/)। आप उससे परे क्या देख रहे हैं? –

+9

[PHPUnit] (http://phpunit.de) defacto इकाई परीक्षण ढांचा है। टीबीएच मैंने कभी भी उत्साह के बारे में नहीं सुना है (यह एक सस्ता शूट न करें, केवल ईमानदार होना)। –

+0

@ कोलिन - शायद मैं सिर्फ नकली उपयोग को समझ नहीं रहा हूं। उस गाइड में दिए गए निर्देशों के बाद मुझे उन परिणामों को नहीं मिल रहा है जिनकी मुझे उम्मीद है। मैं मूल पोस्ट – baiano

उत्तर

3

यह:

function __construct() 
{ 
    $this->OtherClass = new OtherExampleClass; 
} 

होना चाहिए:

function __construct($otherClass) 
{ 
    $this->OtherClass = $otherClass; 
} 

आपका नकली अपने परीक्षण में इस बिंदु पर कभी नहीं इंजेक्ट किया जाता है:

$target = new ExampleClass($mock); 
+0

पर कुछ कोड जोड़ूंगा, मैंने मूल पोस्ट संपादित किया था। क्या यह आपके उत्तर से क्या मतलब है? – baiano

+1

मैं बिल्कुल एक कन्स्ट्रक्टर नहीं करता जिसमें आपके पास डिफ़ॉल्ट ऑब्जेक्ट सृजन होता है। बस मानक ** निर्भरता इंजेक्शन ** के साथ रहें, इसके अलावा, 'कुछ' विधि में आपके परीक्षण में पैरामीटर हैं, लेकिन यह लागू नहीं किया गया है। – Gutzofter

+0

यही वह है जिसे मैं समझने की कोशिश कर रहा हूं। मानक निर्भरता इंजेक्शन क्या है ..? PHP के ट्यूटोरियल को बढ़ाने के उदाहरण पूरे चित्र को नहीं दिखाते हैं और उपर्युक्त कोड ही एकमात्र तरीका है कि मैं परीक्षण करने के लिए परीक्षण प्राप्त करने में सक्षम हूं। – baiano

1

एक बात मैं कोई बात नहीं की सिफारिश करेंगे क्या परीक्षण फ्रेमवर्क जिसका आप उपयोग कर रहे हैं वह अपेक्षित वर्ग, या इंटरफेस के खिलाफ टाइप-संकेत है।

<?php 
class ExampleClass 
{ 
    private $OtherClass; // OtherClass instance 

    public function __construct(OtherClass $OtherClass=null) 
    { 
     // ... 
    } 
} 

मुझे कोई di विशेषज्ञ हूँ, लेकिन मैं प्रत्येक वर्ग के कॉल नई दे अगर एक उदाहरण के लिए एक विशेष निर्भरता के लिए प्रदान नहीं की है में समस्या नहीं दिख रहा। आप निश्चित रूप से उस दृष्टिकोण को भी ले सकते हैं जहां आप निर्भरताओं को कॉन्फ़िगर करने के लिए सेटटर विधियों का उपयोग करते हैं।

<?php 
class class ExampleClass 
{ 
    private $OtherClass; // OtherClass instance 

    public function setOtherClass(OtherClass $OtherClass) 
    { 
    $this->OtherClass = $OtherClass; 
    } 
} 

यह लंगड़ा है कि नमूना कोड में ExampleClass भी ExampleDependencyClassTests से DoSomething विधि को परिभाषित नहीं करता है, लेकिन अगर मैं सही ढंग से समझ यह तरह लग रहा है बेहतर बनाएँ पीएचपी लिए मजबूर नहीं कर रहा है आप निर्भरता इंजेक्शन की एक विशेष शैली लेना। लेकिन आप चाहते हैं आप परीक्षण वर्ग लिख सकते हैं, तो उदाहरण के लिए यदि आप सेटर विधि दृष्टिकोण मैं उपर्युक्त ले लिया है, आप उदाहरण

<?php 
class ExampleDependencyClassTests extends \Enhance\TestFixture 
{ 
    public function verifyWithAMock() 
    { 
     $mock = \Enhance\MockFactory::createMock('ExampleDependencyClass'); 
     $mock->addExpectation(
      \Enhance\Expect::method('getSomething') 
      ->with(1, 'Arg2') 
      ->returns('Something') 
      ->times(1) 
     ); 
     $target = new ExampleClass(); 
     $target->setExampleDependencyClass($mock); 
     $result = $target->doSomething(); 
     $mock->verifyExpectations(); 
    } 
} 

बेशक यह probly भावना उचित बनाने के लिए होगा करने के लिए नकली कोड बदल सकता है उदाहरण क्लास में संशोधन!

<?php 
class ExampleClass 
{ 
    private $ExampleDependencyClass; 

    public function addTwoNumbers($a, $b) 
    { 
     return $a + $b; 
    } 

    public function setExampleDependencyClass(
     ExampleDependencyClass $ExampleDependecyClass 
    ) { 
     $this->ExampleDependecyClass = $ExampleDependecyClass; 
    } 

    public function doSomething($someArg) 
    { 
     return 'Something'; 
    } 
} 

मैं PHPUnit काफ़ी साथ काम किया है, और ईमानदारी से आप Mocks वहाँ के साथ एक ही चुनौतियों का सामना करना होगा। मेरे पास 2 सेंट, Mocks यदि संभव हो तो बिना अपने परीक्षण मॉडल करने के लिए कोशिश;)

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