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

时间:2018-09-03 13:33:53

标签: laravel laravel-5 phpunit ziparchive

我在laravel 5.6应用程序中使用ZipArchive类来处理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类上模拟属性?

谢谢

1 个答案:

答案 0 :(得分:0)

好的,有2个选项,您可以使用Mockery模拟公共属性,也可以模拟count()函数。

$this->zipArchiveMock->set('numFiles', 2);

(我不知道您是否使用Mockery,但它包含在Laravel中,所以我认为您确实使用过) http://docs.mockery.io/en/latest/reference/public_properties.html

或者:

$this->zipArchiveMock->expects($this->once())
    ->method('count')
    ->will($this->returnValue(2));

编辑:

您不是在使用Mockery,而是在使用PHPunit。我找不到用PHPUnit模拟对象上的属性或设置模拟上的属性的方法。相反,我建议您像这样使用Mockery:

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

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

希望这对您有用。