如何在Laravel测试中模拟类的属性

如何在Laravel测试中模拟类的属性,laravel,laravel-5,phpunit,ziparchive,Laravel,Laravel 5,Phpunit,Ziparchive,我使用我的Laravel5.6应用程序中的类来处理zip文件。在测试中,我为ZipArchive类创建了一个模拟,如下所示: $this->zipArchiveMock = $this->createMock(ZipArchive::class); 我可以模拟ZipArchive类上的方法,如下所示: $this->zipArchiveMock->expects($this->once()) ->method('open')

我使用我的Laravel5.6应用程序中的类来处理zip文件。在测试中,我为ZipArchive类创建了一个模拟,如下所示:

$this->zipArchiveMock = $this->createMock(ZipArchive::class);
我可以模拟ZipArchive类上的方法,如下所示:

$this->zipArchiveMock->expects($this->once())
            ->method('open')
            ->will($this->returnValue(true));
我想模拟ZipArchive类的一个名为numFiles的属性。我试过做
$this->zipArchiveMock->numFiles=2
。但是
$this->zipArchiveMock->numFiles
始终为0。如何模拟ZipArchive类上的属性


谢谢

好的,因此有两个选项,您可以使用mockry模拟公共属性,也可以模拟
count()
函数

$this->zipArchiveMock->set('numFiles', 2);
(我不知道你是否使用嘲弄,但它包含在《拉威尔》中,所以我认为你使用了)

或:

编辑:

你不是在嘲笑,而是在嘲笑。我找不到在对象上模拟属性的方法,也找不到使用PHPUnit在模拟上设置属性的方法。相反,我建议你用这样的嘲弄:

$this->zipArchiveMock = \Mockery::mock('ZipArchive');
$this->zipArchiveMock->set('numFiles', 2);

$this->zipArchiveMock->shouldReceive('open')
        ->once()
        ->andReturn(true);

希望这对您有用。

谢谢您的回复。Im使用PHP7.1.21,ZipArchive的count()函数仅在7.2中可用(参考:)。所以我必须使用numFiles属性。我做了
$this->zipArchiveMock->set('numFiles',2)如您所建议,但随后我得到了对未定义方法Mock_ZipArchive_90b9991f::set()的错误调用
。我刚刚发现您使用的是PHPUnit mocking。我找不到解决你的PHPUnit问题的办法。
set()
方法是一种模拟方法。所以我更新了我的问题来解释更多的嘲弄。
$this->zipArchiveMock = \Mockery::mock('ZipArchive');
$this->zipArchiveMock->set('numFiles', 2);

$this->zipArchiveMock->shouldReceive('open')
        ->once()
        ->andReturn(true);