在PHPUnit模拟对象中配置多个方法

时间:2009-11-13 01:37:28

标签: php phpunit

我正在尝试在PHP和PHPUnit中创建一个模拟对象。到目前为止,我有这个:

$object = $this->getMock('object',
                         array('set_properties',
                               'get_events'),
                         array(),
                         'object_test',
                         null);

$object
    ->expects($this->once())
    ->method('get_events')
    ->will($this->returnValue(array()));

$mo = new multiple_object($object);

忽略我那时隐藏的模糊对象名称,我明白我所做的是什么   - 创建一个模拟对象,配置2个方法,
  - 配置'get_events'方法以返回空白数组,以及
  - 将模拟器放入构造函数中。

我现在要做的是配置第二种方法,但我找不到任何解释如何做的事情。我想做像

这样的事情
$object
    ->expects($this->once())
    ->method('get_events')
    ->will($this->returnValue(array()))
    ->expects($this->once())
    ->method('set_properties')
    ->with($this->equalTo(array()))

或其他一些,但这不起作用。我该怎么做?

切线,如果我需要配置多个方法进行测试,这是否表明我的代码结构很差?

1 个答案:

答案 0 :(得分:11)

我对PHPUnit没有任何经验,但我的猜测是这样的:

$object
  ->expects($this->once())
  ->method('get_events')
  ->will($this->returnValue(array()));
$object
  ->expects($this->once())
  ->method('set_properties')
  ->with($this->equalTo(array()));

你有没有尝试过?


编辑:

好的,通过一些代码搜索,我找到了一些可能帮助你的例子

选中此example

他们这样使用它:

public function testMailForUidOrMail()
{
    $ldap = $this->getMock('Horde_Kolab_Server_ldap', array('_getAttributes',
                                                            '_search', '_count',
                                                            '_firstEntry'));
    $ldap->expects($this->any())
        ->method('_getAttributes')
        ->will($this->returnValue(array (
                                      'mail' =>
                                      array (
                                          'count' => 1,
                                          0 => 'wrobel@example.org',
                                      ),
                                      0 => 'mail',
                                      'count' => 1)));
    $ldap->expects($this->any())
        ->method('_search')
        ->will($this->returnValue('cn=Gunnar Wrobel,dc=example,dc=org'));
    $ldap->expects($this->any())
        ->method('_count')
        ->will($this->returnValue(1));
    $ldap->expects($this->any())
        ->method('_firstEntry')
        ->will($this->returnValue(1));
(...)
}

也许你的问题出在其他地方?

如果有帮助,请告诉我。


EDIT2:

你可以试试这个:

$object = $this->getMock('object', array('set_properties','get_events'));

$object
  ->expects($this->once())
  ->method('get_events')
  ->will($this->returnValue(array()));
$object
  ->expects($this->once())
  ->method('set_properties')
  ->with($this->equalTo(array()));