【问题标题】:Cannot set public property on Mockery mock object无法在 Mockery 模拟对象上设置公共属性
【发布时间】:2015-08-14 16:37:56
【问题描述】:

我正在尝试使用 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 暗示应该可以直接在模拟对象上设置公共属性。我错过了什么?

【问题讨论】:

  • 你用的是什么版本的 PHPUnit?
  • 你用set()andSet()这个函数测试了吗?

标签: php unit-testing mockery


【解决方案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);

【讨论】:

    猜你喜欢
    • 2014-05-19
    • 1970-01-01
    • 2020-11-11
    • 1970-01-01
    • 2015-03-01
    • 2016-09-17
    • 2013-11-24
    • 2016-11-26
    • 1970-01-01
    相关资源
    最近更新 更多