Невозможно установить общедоступное свойство для макета объекта Mockery

Я пытаюсь использовать Mockery для создания фиктивного объекта, который имитирует внутренний класс PHP ZipArchive.

У меня есть что-то вроде следующего кода PHP:

$zipMock = Mockery::mock('ZipArchive');
$zipMock->numFiles = 10;
echo 'NUMBER OF FILES: '.$zipMock->numFiles;

Однако, когда я запускаю его, я получаю следующий результат:

NUMBER OF FILES: 0

Я ожидаю, что он покажет 10, а не 0. Я не могу понять, почему это происходит, поскольку документация подразумевает, что должна быть возможность напрямую устанавливать общедоступные свойства для фиктивных объектов. Что мне не хватает?


person FixMaker    schedule 01.06.2015    source источник
comment
Какую версию PHPUnit вы используете?   -  person vansanblch    schedule 10.11.2015
comment
Вы тестировали его с функцией set() и andSet()?   -  person Hans-Helge    schedule 20.01.2016


Ответы (1)


Я не могу понять, почему это происходит, поскольку в документации подразумевается, что должна быть возможность напрямую устанавливать общедоступные свойства для фиктивных объектов. Что мне не хватает?

Вы упускаете из виду тот факт, что ZipArchive::$numFiles не является стандартным общедоступным свойством. ZipArchive — это не пользовательский класс PHP (простой старый объект PHP), а класс из расширения PHP. Это означает, что свойство действительно доступно только для чтения:

Таким образом, насмешка с помощью Mockery не подходит для свойства num-files. Но вы можете смоделировать свой собственный с этим объектом, здесь с 10 файлами:

$file = tempnam(sys_get_temp_dir(), 'zip');

$zip = new ZipArchive;
$zip->open($file, ZipArchive::CREATE);

foreach(range(1, 10) as $num) {
    $zip->addFromString($num, "");
}

var_dump($zip->numFiles);

$zip->close();
unlink($file);
person hakre    schedule 17.02.2016