2011-02-25 11 views
7

मैं अपने कुछ परीक्षणों में मॉकऑब्जेक्ट्स का उपयोग कर रहा हूं और बस एक सुपर क्लास को कॉल के साथ एक फ़ंक्शन का परीक्षण करना पड़ा और मैं इसे काम नहीं कर पा रहा हूं। क्या यूनिवर्सल इस तरह की कॉल कर सकता है-> सुपर :: सेव() को मजाक नहीं किया जा सकता है? यदि हां, तो आप इसे कैसे करते हैं?पर्ल में सुपर क्लास कॉल का मजाक (टेस्ट :: मॉकऑब्जेक्ट का उपयोग करके)

धन्यवाद।

संपादित करें:

इसे मिला!

उपयोग fake_moduleTest::MockObject

तो से, मान लें कि अपने आधार मॉड्यूल यह Some::Module, और अपने सबरूटीन एक $this->SUPER::save कॉल कर रहा है,

my $child_class_mockup = Test::MockObject->new(); 
$child_class_mockup->fake_module(
    'Some::Module', 
    save => sub() { return 1; } 
); 

का उपयोग सवाल कुछ दिनों के लिए खुला छोड़ करने के लिए, इस उत्तर को स्वीकार करने से पहले इसे करने के विभिन्न तरीकों/पुस्तकालयों के बारे में इनपुट प्राप्त करें (क्या होगा यदि सुपर कॉल में सुपर कॉल था?)।

उत्तर

2

ऑब्जेक्ट के सुपरक्लास (या सुपरक्लास में से एक का पता लगाएं, क्योंकि पर्ल के पास एकाधिक विरासत है), और सुपरक्लास के पैकेज में save कॉल को परिभाषित करें।

उदाहरण के लिए, अगर आप अपने परीक्षण लिपि में है

package MyClass; 
use YourClass; 
our @ISA = qw(YourClass); # <-- name of superclass 
... 
sub foo { 
    my $self = shift; 
    ... 
    $self->SUPER::save(); # <--- want to mock this function in the test 
    ... 
} 

sub save { 
    # MyClass version of save method 
    ... 
} 

फिर, आप कह सकते हैं कि

no warnings 'redefine';  # optional, suppresses warning 

sub YourClass::save { 
    # mock function for $yourClassObj->save, but also 
    # a mock function for $myClassObj->SUPER::save 
    ... 
} 
संबंधित मुद्दे