2011-10-18 11 views
5

मैं PHPUnit परीक्षण में प्रिडिस क्लाइंट को नकल करने की कोशिश कर रहा हूं। जब मैं विधि को कॉल करता हूं तो मैंने परीक्षण करने के लिए प्रयास किया है, परीक्षण के अंत में PHPUnit मुझे बता रहा है कि उम्मीद पूरी नहीं हुई थी।मेरी अपेक्षाओं से मेल खाने वाले प्रिडिस क्लाइंट का मेरा PHPUnit नकली क्यों नहीं है?

class MockRedisTest extends \PHPUnit_Framework_TestCase { 
private $mockRedis; 

public function testMockRedis() { 

    $mockRedis = $this->getMock('Predis\\Client'); 

    $mockRedis->expects( $this->once()) 
     ->method("exists") 
     ->with($this->equalTo("query-key")) 
     ->will($this->returnValue(true)); 

    $mockRedis->exists("query-key"); 
} 

}

और PHPUnit सोचता है कि विधि आमंत्रित नहीं किया गया:

1) MockRedisTest :: testMockRedis अपेक्षा विफल

यहाँ एक कोड नमूना है कि मेरी समस्या reproduces है विधि नाम के लिए 1 बार (ओं) के लिए बराबर होने के बराबर है। विधि को 1 बार कहा जाने की उम्मीद थी, जिसे वास्तव में 0 बार कहा जाता था।

क्यों? क्या ऐसा इसलिए है क्योंकि प्रिडीस क्लाइंट रेडिस कमांड से मेल खाने वाली विधि कॉल का जवाब देने के लिए __call का उपयोग कर रहा है?

अद्यतन: मुझे लगता है कि यह __call विधि के साथ कुछ करने के लिए है। कोड को इस काम में बदलना:

public function testMockRedis() { 

    $mockRedis = $this->getMock('Predis\\Client'); 

    $mockRedis->expects( $this->once()) 
     ->method("__call") 
     ->with("exists", $this->equalTo(array("query-key"))) 
     ->will($this->returnValue(true)); 

    $mockRedis->exists("query-key"); 
} 

सुनिश्चित नहीं है कि मैं इससे संतुष्ट हूं। क्या प्रॉक्सी विधियों के लिए __call का उपयोग करने वाले वर्गों का नकल करने का कोई बेहतर तरीका है?

उत्तर

8

मुझे लगता है कि आप

$mockRedis = $this->getMock('Predis\\Client', array('exists')); 
// ... 

उपयोग कर सकते हैं अपने जादू समारोह के बारे में पता करने के लिए नकली वस्तु के लिए मजबूर करने। यह विधि exists() विधि के लिए नकली क्षमताओं के लिए सीमा है। आपको विशेष रूप से मॉक करने के लिए हर दूसरी विधि को शामिल करना होगा।

+0

बिल्कुल सही। धन्यवाद। –

0

आप एक विशिष्ट सर्वर प्रोफ़ाइल उपहास करने के लिए और सुनिश्चित करें कि आप बुला एक अलग सर्वर संस्करण के तरीकों नहीं कर रहे हैं, का उपयोग

<?php 
$mockRedis = $this->getMock('Predis\\Client', array_keys((new Predis\Profiles\ServerVersion26)->getSupportedCommands())); 
0

PHPUnit 5 के लिए, का उपयोग

$this->createPartialMock('Predis\\Client', ['exists']); 

बनाना चाहते हैं अपने नकली "मौजूद" विधि (या किसी भी अन्य लाल मूल निवासी) के बारे में पता है

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