无法在Mockery模拟对象上设置公共属性

时间:2015-06-01 09:17:51

标签: php unit-testing mockery

我试图使用Mockery创建一个模仿PHP内部ZipArchive类的模拟对象。

我有类似下面的PHP代码:

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

然而,当我运行它时,我得到以下结果:

NUMBER OF FILES: 0

我希望它显示10而不是0.我无法解决为什么会发生这种情况,因为the documentation意味着应该可以直接在模拟对象上设置公共属性。我错过了什么?

1 个答案:

答案 0 :(得分:1)

  

我无法弄清楚为什么会发生这种情况,因为文档暗示应该可以直接在模拟对象上设置公共属性。我错过了什么?

您错过了ZipArchive::$numFiles 标准公共财产的观点。 ZipArchive 不是userland 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);