Настройка нескольких методов в макетных объектах 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);

Не обращая внимания на мои ужасно неоднозначные имена объектов на минуту, я понимаю, что то, что я сделал, это
- Создал фиктивный объект с двумя методами настройки,
- Сконфигурировал метод get_events для возврата пустого массива, и
- Перетащил макет в конструктор.

Что я хотел бы сделать сейчас, так это настроить второй метод, но я не могу найти ничего, что объясняло бы, как это сделать. Я хочу сделать что-то вроде

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

или что-то в этом роде, но это не работает. Как мне это сделать?

По касательной, означает ли это, что я плохо структурировал свой код, если мне нужно настроить более одного метода для тестирования?


person TR.    schedule 13.11.2009    source источник


Ответы (1)


У меня нет опыта работы с 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 => '[email protected]',
                                      ),
                                      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()));
person Carlos Lima    schedule 13.11.2009
comment
Похоже, это действительно правильный путь. Проверьте мою правку. Может еще что-то не так? Если вы поделитесь более полным фрагментом кода, возможно, другие или я смогу помочь. - person Carlos Lima; 13.11.2009