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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Laravel测试中模拟类的属性相关的知识,希望对你有一定的参考价值。

我在我的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类上模拟属性?

谢谢

答案

好的,有两个选项,您可以使用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);

希望这对你有用。

以上是关于如何在Laravel测试中模拟类的属性的主要内容,如果未能解决你的问题,请参考以下文章

如何在C#中模拟基类属性或方法

在 Laravel 中运行功能测试时如何模拟服务(或服务提供者)?

如何在 PHPUnit / Laravel 中模拟 JSON 文件

如果在Laravel 5.5单元测试中隐藏密码,如何模拟用户创建

如何模拟 Laravel Eloquent 模型的静态方法?

Laravel:如何在控制器的几种方法中重用代码片段