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

nhhxz33t  于 2022-12-17  发布在  PHP
关注(0)|答案(2)|浏览(158)

我正在尝试用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()))

或者类似的东西,但那不起作用,我该怎么做呢?
顺便说一句,如果我需要配置多个方法来测试,这是否表明我的代码结构很差?

a7qyws3x

a7qyws3x1#

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

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

你已经试过了吗?
编辑:
好了,通过搜索代码,我找到了一些可能对您有所帮助的示例
检查此示例
他们是这样使用的:

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));
(...)
}

也许你的问题出在别的地方?
如果有帮助就告诉我。
编辑2:
你能试试这个吗:

$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()));
hm2xizp9

hm2xizp92#

寻找解决方案以多次调用mock对象上的“相同”方法(可能使用不同的参数和返回值)的人可以使用post中的@Cody A. Ray的answer
以下是帖子中的答案,以防链接无效:
对于那些既希望匹配输入参数又希望为多个调用提供返回值的人来说,这对我很有效:

$mock
  ->method('myMockedMethod')
  ->withConsecutive([$argA1, $argA2], [$argB1, $argB2], [$argC1, $argC2])
  ->willReturnOnConsecutiveCalls($retValue1, $retValue2, $retValue3);

相关问题