क्या आप phpunit में मैक क्लास के संरक्षित गुण प्राप्त करने के लिए कॉलबैक के अंदर $ $ का उपयोग कर सकते हैं? या इसे प्राप्त करने का कोई और तरीका है? अगर आप मज़ाक उड़ाया वस्तुओं इंजेक्शन लगाने के बारे में सोचते हैं
$mock = $this->getMock('A', array('foo'));
$mock->expects($this->any())->method('foo')->will(
$this->returnCallback(function() {
return $this->bar;
}));
यह वास्तव में उपयोगी हो सकता है। कभी-कभी कक्षा में अन्य वर्ग के लिए हार्ड-कोडेड निर्भरता होती है, लेकिन यह इसे विधि के साथ बनाती है जिसे आप सैद्धांतिक रूप से नकली बना सकते हैं और हार्ड-कोड ऑब्जेक्ट के बजाय मॉक ऑब्जेक्ट बना सकते हैं। कृपया दूसरे उदाहरण को देखें।
class A {
protected $bar = "bar";
public function foo() {
$b = new B();
return $b->fizz($this->bar);
}
}
class B {
public function fizz ($buzz) {
return $buzz;
}
}
लेकिन कहें कि कक्षा बी कुछ खराब करता है और मैं इसे नकली के साथ बदलना चाहता हूं।
$mockB = $this->getMock('B');
// (...) - and probably mock other things
$mockA = $this->getMock('A', array('foo'));
$mockA->expects($this->any())->method('foo')->will(
$this->returnCallback(function() use ($mockB) {
return $mockB->fizz($this->bar);
}));
क्या यह किसी भी तरह से प्राप्त करने योग्य है?
PHP Fatal error: Using $this when not in object context in (...)
use
कीवर्ड का उपयोग करते हुए मैं माता पिता के दायरे से $ mockA वारिस कर सकते हैं::
, वर्तमान में, अगर मैं फिर ऊपर की तरह यह कर मैं त्रुटि मिलती है
$mockB = $this->getMock('B');
// (...) - and probably mock other things
$mockA = $this->getMock('A', array('foo'));
$mockA->expects($this->any())->method('foo')->will(
$this->returnCallback(function() use ($mockA, $mockB) {
return $mockB->fizz($mockA->bar);
}));
लेकिन इस तरह मैं बार को सार्वजनिक रूप से एक्सेस करने का प्रयास करूंगा और मुझे मिल जाएगा:
PHP Fatal error: Cannot access protected property (...)
हाँ मैं जानता हूँ कि मैं सार्वजनिक गेटर परिभाषित लेकिन कहते हैं कि यह एक बाहरी पुस्तकालय है या आप बस इसे सुरक्षित रखने के लिए करना चाहते हैं कर सकते हैं। पूरा प्रश्न इस बात के बारे में है कि दिए गए मामले में कक्षा के संरक्षित गुण कैसे प्राप्त करें। तो PHP 5.3 के लिए उत्तर अभी भी नहीं है, आप ऐसा नहीं कर सकते हैं। PHP 5.4 के लिए, बढ़िया आप इसका उपयोग कर सकते हैं! यह बहुत बड़ा कदम है! लेकिन फिर भी मुझे कक्षा को बदलने की जरूरत है जिसे मैं बदलना नहीं चाहता हूं। क्या आप कम से कम कक्षा बना सकते हैं जो 'getCallback (B $ b)' जोड़ने के लिए ए को बढ़ाता है? इसे जांचने की आवश्यकता है। इस सुविधा का उल्लेख करने के लिए –