【问题标题】:How to mock only one method with Laravel using PhpUnit如何使用 PhpUnit 仅使用 Laravel 模拟一种方法
【发布时间】:2020-05-13 16:20:15
【问题描述】:

我有这个测试:

<?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);
        });

如您所见,此测试有 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

【问题讨论】:

  • 你的测试类扩展了哪个测试用例?
  • 您好,先生。类 BranchTest 扩展了 TestCase
  • 和use语句有一个phpunit一个和一个laravel一个
  • 我已经用你想要的信息编辑了这个问题。谢谢先生

标签: laravel phpunit mockery


【解决方案1】:

在 Laravel 6.2 中首次添加了 PartialMock 速记,请参见 release notes。所以升级到 6.2 应该可以解决您的问题。

其次,您可以将以下 sn-p 添加到您的 Tests\TestCase.php 类中,它应该可以工作。

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

【讨论】:

  • 非常感谢先生。我将我的项目升级到 6.12,现在我的测试工作正常。我对这个问题的模拟了解了很多。在丹麦度过愉快的一天。
猜你喜欢
  • 2018-05-26
  • 2014-09-15
  • 2019-03-13
  • 2017-02-27
  • 2021-03-31
  • 1970-01-01
  • 2014-01-01
  • 2015-07-10
  • 2014-05-05
相关资源
最近更新 更多