php

2010-11-19 5 views
16

में यूनिट परीक्षण दिनांक फ़ंक्शंस के लिए वर्तमान समय को कैसे बदला जाए, मैं यूनिट-परीक्षण दिनांक-मैनिपुलेशन-क्लास के लिए PHP में वर्तमान समय (यानी समय() का आउटपुट) कैसे बदलूं? जैसे आपphp

+0

http://stackoverflow.com/questions/530649/is-it-possible-to-replace-monkeypatch-php-functions –

+0

क्या आप कुछ कोड दिखा सकते हैं? मेरी राय में, यदि आपको यूनिट परीक्षण के लिए 'समय() 'ओवरराइड करने की आवश्यकता है, तो * परीक्षण या कोड के साथ * कुछ गलत हो सकता है। – netcoder

+0

कक्षा वर्तमान तारीख में हेरफेर। मैं बस सभी तिथियों में सभी विधियों को सही ढंग से जांचना चाहता हूं। – happytoad

उत्तर

3

लग रहा है। ऐसा लगता है कि आप अपनी कक्षा के अंदर समय() फ़ंक्शन का उपयोग कर रहे हैं जबकि यूनिट परीक्षण के साथ आप यह सुनिश्चित करना चाहते हैं कि आप उन तरीकों/कक्षाओं के आउटपुट को नियंत्रित करें जो आपके लिए समय प्रदान करते हैं। मैं कहूंगा कि एक टाइम क्लास बनाएं जो आपको समय प्रदान करे और इसे अपने यूनिट परीक्षणों में नकली करे।

+0

तो, मुझे केवल कक्षा के तर्क को परीक्षण के लिए बदलना चाहिए? – happytoad

+1

@happytoad - आपको बस अपनी तिथि मैनिपुलेशन क्लास में कॉल को 'टाइम()' में बदलने की आवश्यकता नहीं है। उदाहरण के लिए आप पैरामीटर के रूप में परीक्षण कर रहे फ़ंक्शन के लिए एक समय मान पास कर सकते हैं, या आप इसे अपनी तिथि वर्ग के निर्माता को पास कर सकते हैं। – rojoca

+1

इसलिए समय बदलने का कोई तरीका नहीं है। यह अजीब बात है कि वर्तमान समय को बदलने जैसी साधारण चीज़ परीक्षण के लिए उपलब्ध नहीं है। बहुत बेकार। धन्यवाद। – happytoad

3

मेरा अनुमान है कि आप अपने निर्भरता के साथ संघर्ष कर रहे हैं है अपनी तिथि हेरफेर वर्ग से time() की निर्भरता को निकालना होगा

5

मैंने हाल ही में एक समाधान के साथ आया है यदि आप PHP 5.3 नेमस्पेस का उपयोग कर रहे हैं तो यह बहुत अच्छा है। आप अपने वर्तमान नेमस्पेस के अंदर एक नया समय() फ़ंक्शन लागू कर सकते हैं और एक साझा संसाधन बना सकते हैं जहां आपने अपने परीक्षणों में रिटर्न वैल्यू सेट किया है। फिर किसी भी अयोग्य कॉल समय() आपके नए फ़ंक्शन का उपयोग करेगा।

आगे पढ़ने के लिए मैं में विस्तार से वर्णित मेरी blog

+1

मैंने हाल ही में पुस्तकालय [php-mock] (https://github.com/malkusch/php-mock) लागू किया है जो 'समय() 'जैसे गैर निर्धारक PHP कार्यों को मॉक करने के लिए उस भाषा सुविधा का उपयोग करता है। –

3

आप एक इंटरफेस आधारित विरासत मॉडल पर विचार हो सकता:

interface iClock 
{ 
    public function getTime(); 

} 

class SystemClock implements iClock 
{ 
    public function getTime() 
    { 
     return time(); 
    } 
} 

class FakeClock implements iClock 
{ 
    private $time; 

    function __construct($time) 
    { 
     $this->time = $time; 
    } 

    public function getTime() 
    { 
     return $this->time; 
    } 

    // you could have more functions to advance the time, etc. 
} 

आपका अपना वर्गों वर्तमान समय एक ले जाएगा के साथ काम करने की जरूरत है कि iClock इंटरफ़ेस प्रकार का कन्स्ट्रक्टर पैरामीटर। BTW

$realWorldInstance = new YourOwnClass(new SystemClock()); 
echo $realWorldInstance->someFunction(); 
$unitTestInstance = new YourOwnClass(new FakeClock(1234)); 
echo $unitTestInstance->someFunction(); 

- मैं इस पैटर्न अक्सर का उपयोग करें:

class YourOwnClass 
{ 
    private $clock; 

    function __construct(iClock $clock) 
    { 
     $this->clock = $clock; 
    } 

    function someFunction() 
    { 
     $now = $this->clock->getTime(); 

     // whatever 
     return $now; 
    } 
} 

तो फिर तुम बस घड़ी के प्रकार डालेगी आप चाहते थे, पर कि क्या आप एक इकाई परीक्षण में नहीं थे या निर्भर करता है .NET में भी। यह Noda Time द्वारा प्रदान किए गए IClock इंटरफ़ेस में भी बनाया गया है। मुझे कोई कारण नहीं दिख रहा कि यह पैटर्न PHP में क्यों काम नहीं करेगा। आप केवल पूर्णांक टाइमस्टैम्प के बजाय DateTime वापस करना चुन सकते हैं, लेकिन उपरोक्त पैटर्न का उपयोग करने के लिए न्यूनतम आवश्यक है।

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

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