2012-05-15 12 views
8

यहाँ में ArrayAccess लागू करता है छोटा करते वर्ग मैं के लिए टेस्ट स्वीट लिख रहा हूँ के निर्माता है (यह mysqli फैली):मजाक/एक वर्ग का एक उद्देश्य है कि PHPUnit

function __construct(Config $c) 
{ 
    // store config file 
    $this->config = $c; 

    // do mysqli constructor 
    parent::__construct(
     $this->config['db_host'], 
     $this->config['db_user'], 
     $this->config['db_pass'], 
     $this->config['db_dbname'] 
    ); 
} 

Config वर्ग निर्माता के लिए पारित

class Config implements arrayaccess{...} 

मैं/ठूंठ Config वस्तु कैसे नकली है: arrayaccess इंटरफ़ेस php करने के लिए बनाया लागू करता है? मुझे किस का उपयोग करना चाहिए और क्यों?

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

उत्तर

15

यदि आप आसानी से एक सरणी से Config उदाहरण बना सकते हैं, तो यह मेरी वरीयता होगी। जबकि आप अलगाव में अपनी इकाइयों का परीक्षण करना चाहते हैं, जहां व्यावहारिक, सरल सहयोगी जैसे Config परीक्षण में उपयोग करने के लिए पर्याप्त सुरक्षित होना चाहिए। इसे सेट करने के लिए कोड समकक्ष नकली ऑब्जेक्ट की तुलना में पढ़ने और लिखने (कम त्रुटि-प्रवण) के लिए संभवतः आसान होगा।

$configValues = array(
    'db_host' => '...', 
    'db_user' => '...', 
    'db_pass' => '...', 
    'db_dbname' => '...', 
); 
$config = new Config($configValues); 

कहा जा रहा है, आप एक वस्तु बस के रूप में आप किसी भी अन्य वस्तु ArrayAccess को लागू नकली।

$config = $this->getMock('Config', array('offsetGet')); 
$config->expects($this->any()) 
     ->method('offsetGet') 
     ->will($this->returnCallback(
      function ($key) use ($configValues) { 
       return $configValues[$key]; 
      } 
     ); 

तुम भी at का उपयोग पहुँच की एक विशिष्ट लागू करने के क्रम सकते हैं, लेकिन आप बहुत भंगुर परीक्षण कि जिस तरह से बना देंगे।

+0

महान उत्तर, धन्यवाद! – AndyPerlitch

+0

आप इसे भी आसान कर सकते हैं, लेकिन एक सरणी का उपयोग कर :-) –

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