2010-06-29 15 views
33

का उपयोग कर पीडीओ ऑब्जेक्ट का मज़ाक उड़ाते हुए मुझे पीडीओ ऑब्जेक्ट को PHPUnit के साथ मजाक करने में कठिनाई हो रही है।PHPUnit

वहाँ मेरी समस्या के बारे में वेब पर लेकिन मैं क्या इकट्ठा कर सकते हैं से अधिक से अधिक जानकारी हो प्रतीत नहीं होता:

  1. पीडीओ 'अंतिम' __wakeup और __sleep तरीकों है कि यह धारावाहिक होने से रोकने के है।
  2. PHPunit के नकली ऑब्जेक्ट कार्यान्वयन किसी बिंदु पर ऑब्जेक्ट को क्रमबद्ध करता है।
  3. यूनिट परीक्षण तब होता है जब पीडीओ द्वारा उत्पन्न PHP त्रुटि में विफल होता है।

, अपने इकाई परीक्षण करने के लिए निम्न पंक्ति जोड़कर एक विशेषता इस व्यवहार को रोकने के लिए होती है:

class MyTest extends PHPUnit_Framework_TestCase 

{  
    protected $backupGlobals = FALSE; 
    // ... 

} 

स्रोत: http://sebastian-bergmann.de/archives/797-Global-Variables-and-PHPUnit.html

मेरे लिए काम यह नहीं है, अपने परीक्षण अभी भी पैदा करता है एक त्रुटि।

पूर्ण परीक्षण कोड:

class MyTest extends PHPUnit_Framework_TestCase 
{ 

    /** 
    * @var MyTest 
    */ 
    private $MyTestr; 

    protected $backupGlobals = FALSE; 

    /** 
    * Prepares the environment before running a test. 
    */ 
    protected function setUp() 
    { 
     parent::setUp(); 

    } 

    /** 
    * Cleans up the environment after running a test. 
    */ 
    protected function tearDown() 
    { 

     parent::tearDown(); 
    } 

    public function __construct() 
    { 

     $this->backupGlobals = false; 
     parent::__construct(); 

    } 


    /** 
    * Tests MyTest->__construct() 
    */ 
    public function test__construct() 
    { 

     $pdoMock = $this->getMock('PDO', array('prepare'), array(), '', false); 

     $classToTest = new MyTest($pdoMock); 

     // Assert stuff here! 


    } 

    // More test code....... 

किसी भी PHPUnit प्रो की मुझे एक हाथ दे सकता है?

धन्यवाद,

बेन

उत्तर

47

$ backupGlobals आप मदद नहीं करता है, क्योंकि इस त्रुटि कहीं और से आता है। PHPUnit 3.5.2 (संभवतः पिछले संस्करणों के साथ-साथ) PHPUnit/फ्रेमवर्क में निम्न कोड है/MockObject/Generator.php

if ($callOriginalConstructor && 
     !interface_exists($originalClassName, $callAutoload)) { 
     if (count($arguments) == 0) { 
      $mockObject = new $mock['mockClassName']; 
     } else { 
      $mockClass = new ReflectionClass($mock['mockClassName']); 
      $mockObject = $mockClass->newInstanceArgs($arguments); 
     } 
    } else { 
     // Use a trick to create a new object of a class 
     // without invoking its constructor. 
     $mockObject = unserialize(
      sprintf(
      'O:%d:"%s":0:{}', 
      strlen($mock['mockClassName']), $mock['mockClassName'] 
     ) 
     ); 
    } 

यह "चाल" के साथ unserialize प्रयोग किया जाता है जब आप getMock पूछना मूल निर्माता पर अमल नहीं करने के लिए और यह तुरंत पीडीओ के साथ असफल हो जाएगा।

तो, इसके आसपास कैसे काम करते हैं?

एक विकल्प यह

class mockPDO extends PDO 
{ 
    public function __construct() 
    {} 

} 

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

$pdoMock = $this->getMock('mockPDO', array('prepare')); 

इस की तरह नकली बनाना, लेकिन जब से यह अब mockPDO परीक्षण सहायक के लिए हानिकारक नहीं धन्यवाद है, आप परीक्षण जारी रख सकते हैं: फिर, इस के लिए अपने परीक्षण कोड बदल जाते हैं।

+0

यह काम करता है। धन्यवाद! – uckelman

+1

आप पिताजी हैं! बहुत बहुत धन्यवाद यह ठीक काम करता है। मैंने इस मुद्दे को हल करने के लिए छोड़ दिया था! –

+0

मुझे मूल पोस्टर के समान समस्या थी और आपके समाधान का उपयोग किया। हालांकि अब मेरी टाइपिंगटिंग इसे पीडीओ के रूप में नहीं देखती है। 'पीडीओ का एक उदाहरण होना चाहिए, Mock_PDOMock_96936f72 दिया गया उदाहरण – nvanesch

2
सबसे अच्छा मैं runkit का उपयोग करें और के रूप में runkit_function_redefine का उपयोग कर संरक्षित दो अंतिम तरीकों को फिर से परिभाषित करने के लिए है के बारे में सोच सकते हैं

php.ini में runkit.internal_override सेटिंग को सक्षम करने के लिए न करें।

और के रूप में कभी, eval साथ के रूप में, runkit जवाब की तरह लगता है, तो सवाल शायद गलत :)

+0

मुझे नहीं लगता कि परीक्षण उद्देश्यों के लिए 'रनकिट' या 'eval' का उपयोग करके कुछ भी गलत है। – netcoder

1

आप अपने परीक्षण मामले में अपने परीक्षण मामले को तुरंत चालू कर रहे हैं?

$classToTest = new MyTest($pdoMock); 

अभी, आप अनिवार्य रूप से अपने परीक्षण मामले का परीक्षण कर रहे हैं। यह कुछ और होना चाहिए:

$classToTest = new My($pdoMock); 
+0

यह मूल प्रश्न में निश्चित रूप से एक बग है। – uckelman

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