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对象上设置公共属性.我错过了什么?
我无法弄清楚为什么会发生这种情况,因为文档暗示应该可以直接在模拟对象上设置公共属性。我缺少什么?
你忽略了一点,那就是它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)