Как смоделировать только один метод с laravel - phpunit - PullRequest
1 голос
/ 28 января 2020

У меня есть этот тест:

<?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.

В документации написано:

Вы можете использовать методpartalmock, когда вам нужно только смоделировать несколько методов объекта. Методы, которые не являются имитированными, будут нормально выполняться при вызове:

$ this- >partMock (Service :: class, function ($ mock) {$ mock-> shouldReceive ('process') -> Once ( .) 1016 *

И когда я пытаюсь использовать макет c (не частичный), у меня появляется эта ошибка: Получено Mockery_1_App_Services_MemberService :: createMember (), но ожидания не были указаны , конечно, потому что есть 2 функции в этом классе и так phpunit не знает, что делать с функцией 'createMember'.

Так что вы мне предлагаете? (newb ie в тестах phpunit).

Merci Dom

РЕДАКТИРОВАТЬ: laravel 6.0 phpunit 7.5

1 Ответ

1 голос
/ 28 января 2020

Сокращение 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());
}
...