2013-01-04 6 views
5

PHPUnit और एक नकली वस्तु का उपयोग के साथ get_class का उपयोग करता है, मैं कुछ कोड get_class का उपयोग करता है निर्धारित करने के लिए एक वस्तु एक फिल्टर या नहीं द्वारा शामिल की गई है परीक्षण करने के लिए कोशिश कर रहा हूँ।परीक्षण कोड PHPUnit नकली वस्तुओं

class BlockFilter implements FilterInterface 
{ 
    private $classes; 

    public function __construct(array $classes = array()) 
    { 
     $this->classes = $classes; 
    } 

    public function isIncluded(NodeTraversableInterface $node) 
    { 
     if (Type::BLOCK != $node->getDocumentType()) { 
      return false; 
     } 

     if (! empty($this->classes)) { 
      /*** HERE IS THE PROBLEM: ***/ 
      return in_array(get_class($node), $this->classes); 
     } 

     return true; 
    } 
} 

यहाँ मेरी इकाई परीक्षण से विधि है::

यहाँ वर्ग परीक्षण किया जाना है

public function testIfContainerBlockIsIncluded() 
{ 
    $containerBlock = $this->getMock('Pwn\ContentBundle\Document\ContainerBlock'); 
    $containerBlock->expects($this->any())->method('getDocumentType')->will($this->returnValue(Type::BLOCK)); 

    $filter = new BlockFilter(array('Pwn\ContentBundle\Document\ContainerBlock')); 
    $this->assertTrue($filter->isIncluded($containerBlock)); 
} 

नकली वस्तु $containerBlock बर्ताव करती है वास्तविक वस्तु Pwn\ContentBundle\Document\ContainerBlock की तरह; यहां तक ​​कि कोड instanceof काम करता है (क्योंकि PHPUnit यह असली वर्ग का एक उपवर्ग बनाता है, मेरा मानना ​​है कि) का उपयोग कर।

कोड परीक्षण किया जा रहा get_class का उपयोग करता है वर्ग के एक स्ट्रिंग मान मिलता है और उम्मीद वर्ग नाम की एक सरणी के साथ तुलना करना।

Mock_ContainerBlock_ac231064 

(_ac231064 प्रत्यय प्रत्येक मंगलाचरण पर बदलती है): दुर्भाग्य से, नकली वस्तु के लिए, get_class कुछ इस तरह देता है।

यह विफल अपने परीक्षण का कारण बनता है, तो मेरे विकल्प क्या हैं?

  • get_class का उपयोग करने से बचने के लिए कोड का पुनर्निर्माण करें? इसका मतलब है कि testable कोड लिखने का प्रयास करते समय get_class का उपयोग नहीं किया जाना चाहिए।
  • एक नकली के बजाय ContainerBlock वर्ग की एक वास्तविक उदाहरण का प्रयोग करें? इसका मतलब है कि हम प्रभावी रूप से दोनों कक्षाओं का परीक्षण कर रहे हैं।
  • कुछ अन्य अद्भुत रूप चतुर चाल है कि आप सभी का सुझाव देने के लिए जा रहे हैं ??? ;)

किसी भी मदद के लिए धन्यवाद ...

उत्तर

2

परीक्षण में नकली के वर्ग के नाम दर्रा:

new BlockFilter(array(get_class($this->containerBlock))); 
+0

अच्छा विचार है, मुझे लगता है कि यह वास्तव में मेरे मन की पीठ में था, लेकिन यह ऐसा लगता है कि किसी भी तरह का 'कृत्रिम' परीक्षण करना; मुझे परीक्षण के साथ गलती की संभावना कम होगी। तो अब मैं सोच रहा हूं कि यह मिक्स के बजाय वास्तविक वस्तुओं का उपयोग करने से बेहतर या बदतर है ... – fazy

+0

@LarsJ मुझे इसके साथ कोई समस्या नहीं दिख रही है। आपका ब्लॉकफिल्टर सरणी में वर्ग के नामों के लिए परीक्षण कर रहा है, इसलिए मॉक का वर्ग नाम पारित करना बिल्कुल ठीक है। एक sidenote पर, मैं कंटेनरब्लॉक के बजाय इंटरफ़ेस का मज़ाक उड़ाऊंगा, क्योंकि उस पर टाइपहिंट है जिसमें शामिल है। – Gordon

+1

आपके सभी विचारों और टिप्पणियों के लिए फिर से धन्यवाद; मैंने इसे अभ्यास में रखा है और यह ठीक काम करता है। – fazy