मैं Phactory, और PHPUnit का उपयोग कर PHP Propel प्रोजेक्ट के लिए एक परीक्षण सूट सेट करने पर काम कर रहा हूं। मैं वर्तमान में फ़ंक्शन का परीक्षण करने की कोशिश कर रहा हूं जो बाहरी अनुरोध करता है, और मैं उस अनुरोध के लिए एक नकली प्रतिक्रिया में स्टब करना चाहता हूं।मैं PHPUnit में बाहरी वेब अनुरोध का नकल कैसे कर सकता हूं?
यहाँ वर्ग मैं परीक्षण करने के लिए कोशिश कर रहा हूँ का एक टुकड़ा है:
class Endpoint {
...
public function parseThirdPartyResponse() {
$response = $this->fetchUrl("www.example.com/api.xml");
// do stuff and return
...
}
public function fetchUrl($url) {
return file_get_contents($url);
}
...
और यहाँ परीक्षण समारोह मैं लिखने के लिए कोशिश कर रहा हूँ है।
// my factory, defined in a seperate file
Phactory::define('endpoint', array('identifier' => 'endpoint_$n');
// a test case in my endpoint_test file
public function testParseThirdPartyResponse() {
$phEndpoint = Phactory::create('endpoint', $options);
$endpoint = new EndpointQuery()::create()->findPK($phEndpoint->id);
$stub = $this->getMock('Endpoint');
$xml = "...<target>test_target</target>..."; // sample response from third party api
$stub->expects($this->any())
->method('fetchUrl')
->will($this->returnValue($xml));
$result = $endpoint->parseThirdPartyResponse();
$this->assertEquals('test_target', $result);
}
मैं अब देख सकते हैं, मैं अपने परीक्षण कोड की कोशिश की के बाद, कि मैं getMock
साथ एक नकली वस्तु बनाने रहा हूँ, और फिर कभी नहीं इसे का उपयोग। तो फ़ंक्शन fetchUrl
वास्तव में निष्पादित करता है, जो मैं नहीं चाहता हूं। लेकिन मैं अभी भी का उपयोग करने में सक्षम होना चाहता हूं, फैक्टरी ने endpoint
ऑब्जेक्ट बनाया है, क्योंकि इसमें सभी सही फ़ील्ड मेरी फैक्टरी परिभाषा से आबादी है।
क्या मेरे पास किसी मौजूदा ऑब्जेक्ट पर विधि को रोकने का कोई तरीका है? तो मैं fetch_url
$endpoint
एंडपॉइंट ऑब्जेक्ट पर अभी बनाया था?
या मैं इस सब गलत के बारे में जा रहा हूं; मेरे पास बाहरी वेब अनुरोधों पर भरोसा करने वाले मेरे फ़ंक्शन यूनिट परीक्षण के लिए एक बेहतर तरीका है?
मैंने "स्टब्बिंग और मॉकिंग वेब सर्विसेज" के संबंध में PHPUnit दस्तावेज पढ़ा है, लेकिन ऐसा करने के लिए उनका नमूना कोड 40 लाइन लंबा है, जिसमें आपके स्वयं के wsdl को परिभाषित करने सहित शामिल नहीं है। मुझे विश्वास है कि यह मेरे लिए इसे संभालने का सबसे सुविधाजनक तरीका है, जब तक कि एसओ के अच्छे लोग दृढ़ता से अन्यथा महसूस न करें।
किसी भी मदद की बहुत सराहना करते हैं, मुझे इस दिन लटका दिया गया है। धन्यवाद!!
यही वह है जो मैंने किया, हालांकि मैं इसके साथ रोमांचित नहीं हूं। मेरे लिए ओवरकिल की तरह 'file_get_contents' _feels_ को लपेटने के लिए बस एक अतिरिक्त कक्षा। यह एक कोड परिवर्तन है, मैं केवल इसका परीक्षण करने के लिए बना रहा हूं, और यह मुझे लगता है। मैं रूबी से आ रहा हूं, जिसमें [वेबमॉक] (https://github.com/bblimke/webmock/) मणि था, जो आपने अपने पिछले पैराग्राफ में वर्णित किया है: "एक वेबसाइट सेवा बनाता है जो आपके परीक्षणों में रहता है और एक "मॉक" के रूप में कार्य करता है, हमेशा पूर्वसंरचित डेटा लौटाता है "। कोडिंग के बदले में मैं खुद के लिए नकली वस्तु मार्ग जाउंगा। विचारों के लिए धन्यवाद! – goggin13
मुझे नहीं लगता कि यह ओवरहेड है। इस तरह के बारे में सोचें: आप इस कोड का उपयोग कई स्थानों पर करने जा रहे हैं। अब से एक वर्ष, file_get_contents के लिए बेहतर कार्यान्वयन का एक तरीका है और आपको इसे हर जगह बदलना होगा। या लगता है कि आप बज़ पर स्विच करना चाहते हैं (जिसे मैं अनुशंसा करता हूं)। उपर्युक्त कोड में, आप ऑब्जेक्ट इंजेक्ट करते हैं और एक विधि कॉल को बदलना होगा। Mayvbe यह आपके छोटे उदाहरण में ओवरहेड है, लेकिन जैसे ही आपका एप्लिकेशन बड़ा हो जाता है और आप file_get_contents का पुन: उपयोग करना चाह सकते हैं, आप इसकी सराहना कर सकते हैं। – Sgoettschkes