在 Laravel 9.x 中使用部分模拟时出现问题
P粉726234648
P粉726234648 2023-09-02 23:28:57
[PHP讨论组]
<p>嘿,laravel 开发人员,我发现了部分模拟的问题,我需要测试一个使用内部方法的方法,这需要被模拟,我尝试使用几种方法来模拟该方法,例如下一个想法:</p> <pre class="brush:php;toolbar:false;">#1 $mockMyClass = Mockery::mock( $myClassInstance )-&gt;makePartial(); #2 $mockMyClass = $this-&gt;partialMock(); #3 $mockMyClass = $this-&gt;createPartialMock(); // and then $mockMyClass-&gt;shouldReceive('internalMethod') -&gt;andReturn($responseInternalMethod);</pre> <p>并且显然使用文档 Laravel Mocking Objects 中描述的方式</p> <pre class="brush:php;toolbar:false;">use App\Service; use Mockery\MockInterface; $mock = $this-&gt;partialMock(Service::class, function (MockInterface $mock) { $mock-&gt;shouldReceive('process')-&gt;once(); });</pre> <p>这些想法都行不通,$mockMyClass 总是执行真正的方法,而不是应该返回 $responseInternalMethod 的模拟方法。有人也有这个问题吗?我需要确认是否是 Laravel、Mockito 或外部的问题,而不是本地环境问题,哈哈。我读懂了你们!</p> <p>技术细节: Laravel 9.x PHP 8.1 PHP 单元 9.5 嘲讽1.5</p>
P粉726234648
P粉726234648

全部回复(1)
P粉885035114

好吧,我找到了解决方案,但无论如何,我有兴趣知道是否有人也遇到这个问题

我解决这个问题的方法是:

public function testRealExternalMethod()
{
    // Create a mock of the dependency that will be used by the class
    $mockDependency = $this->createMock(Dependency::class);
    
    // in this case we need to use a partial mock because we have an internal method
    $mockMyClass = Mockery::mock(
        MyClass::class,
        [$mockDependency, $parameter1]
    )
        ->makePartial();

    $responseInternalMethod = ['needed data'];

    $mockMyClass->shouldReceive('internalMethod')
        ->andReturn($responseInternalMethod);

    $result = $mockMyClass->realExternalMethod($parameter2, $parameter3);
}
这些情况的解决方案是直接创建我的类的模拟实例,并将构造函数所需的所有参数作为依赖项或数据。然后使用模拟类作为真实类继续测试循环。
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号