如何使用 PhpUnit 在 Laravel 中仅模拟一种方法

Dom*_*Dom 1 phpunit laravel mockery

我有这个测试:

<?php

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
use App\Services\AccessTokenService;
use App\Services\MemberService;

class BranchTest extends TestCase    

public function testPostBranchWithoutErrors()
    {
        $this->mock(AccessTokenService::class, function ($mock) {
            $mock->shouldReceive('introspectToken')->andReturn('introspection OK');
        });

        $this->mock(MemberService::class, function ($mock) {
            $mock->shouldReceive('getMemberRolesFromLdap')->andReturn(self::MOCKED_ROLES);
        });
Run Code Online (Sandbox Code Playgroud)

如您所见,此测试有 2 个模拟。第二个“MemberService:class”是我当前的问题。此类中有 2 个函数:“createMember”和“getMemberRolesFromLdap”。我精确地说,我只想模拟“getMemberRolesFromLdap”函数。

在文档中,写道:

当你只需要模拟一个对象的几个方法时,可以使用partialMock方法。未被mock的方法在调用时会正常执行:

$this->partialMock(Service::class, function ($mock) { $mock->shouldReceive('process')->once(); });

但是当我使用“partialMock”时,出现以下错误:

错误:调用未定义的方法 Tests\Feature\BranchTest::partialMock()

当我尝试经典模拟(无部分)时,出现以下错误:

收到 Mockery_1_App_Services_MemberService::createMember(),但未指定期望

当然是因为这个类中有 2 个函数,所以 PhpUnit 不知道如何处理函数“createMember”。

接下来我可以尝试什么?我是 PhpUnit 测试的初学者。

编辑

Laravel 6.0
PHPUnit 7.5

mrh*_*rhn 5

PartialMock 简写首先在 Laravel 6.2 中添加,请参见发行说明。因此升级到 6.2 应该可以解决您的问题。

其次,您可以将以下代码片段添加到您的Tests\TestCase.php课程中,它应该可以工作。

protected function partialMock($abstract, Closure $mock = null)
{
    return $this->instance($abstract, Mockery::mock(...array_filter(func_get_args()))->makePartial());
}
Run Code Online (Sandbox Code Playgroud)

通过升级,类似的东西应该使您能够模拟单个函数。

$mock = $this->partialMock(AccessTokenService::class, function (MockInterface $mock) {
    $mock->shouldReceive('introspectToken')->andReturn('introspection OK');
});
Run Code Online (Sandbox Code Playgroud)