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

Fix*_*ker 6 php unit-testing mockery

我正在尝试使用Mockery来创建一个模仿PHP内部ZipArchive类的模拟对象.

我有类似以下PHP代码:

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

但是,当我运行它时,我得到以下结果:

NUMBER OF FILES: 0
Run Code Online (Sandbox Code Playgroud)

我希望它显示10而不是0.我无法弄清楚为什么会发生这种情况,因为文档暗示应该可以直接在mock对象上设置公共属性.我错过了什么?

hak*_*kre 2

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

你忽略了一点,那就是它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);
Run Code Online (Sandbox Code Playgroud)