हाल ही में मैं एक फैक्टरी विधि TDDing कर रहा था। विधि या तो एक सादे वस्तु, या एक डेकोरेटर में लिपटे ऑब्जेक्ट बनाने के लिए थी। सजाए गए ऑब्जेक्ट कई प्रकार के हो सकते हैं, जो सभी स्ट्रेटेजीक्लास का विस्तार कर रहे हैं।
मेरे परीक्षण में, मैं जाँच करना चाहता था, यदि लौटी हुई वस्तु की श्रेणी अपेक्षित है। यह आसान है जब सादे वस्तु ओएस वापस आ गया, लेकिन क्या करना है जब यह एक डेकोरेटर के भीतर लपेटा जाता है?
मैं PHP में कोड करता हूं ताकि मैं ext/Reflection
लिपटे हुए ऑब्जेक्ट की एक कक्षा का पता लगाने के लिए उपयोग कर सकूं, लेकिन यह मुझे चीजों को ओवरकॉम्प्लिकेट करने वाला लग रहा था, और कुछ हद तक फिर से TDD के नियम।
इसके बजाय मैंने यह बताने का फैसला किया getClassName()
कि स्ट्रैटेजीक्लास से कॉल करने पर ऑब्जेक्ट का क्लास नाम वापस आ जाएगा। हालांकि डेकोरेटर से कहा जाता है, यह सजाया वस्तु में उसी विधि द्वारा लौटाए गए मान को लौटाएगा।
इसे और अधिक स्पष्ट करने के लिए कुछ कोड:
interface StrategyInterface {
public function getClassName();
}
abstract class StrategyClass implements StrategyInterface {
public function getClassName() {
return \get_class($this);
}
}
abstract class StrategyDecorator implements StrategyInterface {
private $decorated;
public function __construct(StrategyClass $decorated) {
$this->decorated = $decorated;
}
public function getClassName() {
return $this->decorated->getClassName();
}
}
और एक PHPUnit परीक्षण
/**
* @dataProvider providerForTestGetStrategy
* @param array $arguments
* @param string $expected
*/
public function testGetStrategy($arguments, $expected) {
$this->assertEquals(
__NAMESPACE__.'\\'.$expected,
$this->object->getStrategy($arguments)->getClassName()
)
}
//below there's another test to check if proper decorator is being used
यहाँ मेरी बात यह है कि क्या ऐसे तरीकों को लागू करना ठीक है, जिनका यूनिट परीक्षणों को आसान बनाने के अलावा और कोई उपयोग नहीं है? किसी तरह यह मेरे लिए सही नहीं लगता है।